2017-05-25 2 views
1

Ich möchte den richtigen Weg, um es in einem reinen FP-Stil zu tun.groupBy Element in einer Liste von String in Scala

Wie geht das in Scala?

case class Notes(title: String, body: String, tags: List[String]) 

val notesList: List[Notes] = retrieveNotesList() // it works 

Mehrere Notizen können dieselben Tags haben.

Jetzt möchte ich Notizen nach Tag gruppieren. Ich bin nicht in der Lage, den Code zu Gruppe Notizen von Tag zu vervollständigen:

val notesGroupedByTag: Map[String, List[Notes]] = notesList.groupBy { 
    case note: Notes => note.tags 
}.[_to be completed_] 
+1

Sie geschrieben haben, dass Sie das Ergebnis wollen vom Typ 'Map [String, Liste [String]]' sein. Was sollte der Schlüssel sein und was sollte der Wert sein? Ich vermute Schlüssel ist ein Tag? Was ist mit den Werten? –

+0

Ich stimme @JoeK zu. Vielleicht meintest du "Map [String, List [Notes]]"? – mfirry

+0

Ich reparierte es, um zu entsprechen, nach was ich suche. Der Schlüssel ist "tag" und der Wert ist eine Liste von Notizen. Etwas wie 'Map (" scala "-> Liste (Note_1, Note_2)," Code "-> Liste (Note_1, Note_3)," Theorie "-> Liste (Note_2, Note_3))' das ist, was ich suche . DANK – mvito

Antwort

1
notesList.flatMap(n => n.tags.map(t => (t, n))) // List[(tag, note)] 
     .groupBy(_._1)       // Map[tag, List[(tag, note)] 
     .mapValues(_.map(_._2))    // Map[tag, List[note]] 
+0

auf diese Weise ist der Schlüssel nur ein einzelnes "char" und nicht der gesamte Tag-Name. – mvito

+0

es funktioniert auch und es folgt Ihr Kommentar auf der anderen gepostet. Danke vielmals – mvito

0

Eine Möglichkeit ist, ein gehen dachte Zwischen List[Tag, Notes]:

// Things are a bit more clear with type aliases... 
type Title = String 
type Tag = String 

case class Notes(title: Title, body: String, tags: List[Tag]) 

val notes: List[Notes] = retrieveNotesList() 

val tagedTitle: List[(Tag, Notes)] = 
    notes.flatMap(n => n.tags.map(_ -> n)) 

val notesGroupedByTag: Map[Tag, List[Notes]] = 
    tagedTitle.groupBy(_._1).mapValues(_.map(_._2)) 
+0

gibt es mehrere Tippfehler und es funktioniert überhaupt nicht – mvito

Verwandte Themen