2017-05-25 92 views
1

我想用正確的方式在純FP樣式中執行此操作。在斯卡拉字符串列表中的groupBy元素

如何在Scala中做到這一點?

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

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

多個筆記可以有相同的標籤。

現在我想按標記對筆記進行分組。我不能夠通過標籤來完成代碼組註釋:

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

你寫你想要的結果類型爲Map [String,List [String]]'。關鍵是什麼?價值是什麼?我猜密鑰是標籤?什麼值呢? –

+0

我同意@JoeK。也許你的意思是'Map [String,List [Notes]]'? – mfirry

+0

我修復它以匹配我正在尋找的東西。關鍵是「標記」,值是一個筆記列表。像'Map(「scala」 - > List(Note_1,Note_2),「code」 - > List(Note_1,Note_3),「theory」 - > List(Note_2,Note_3))''這就是我正在尋找的東西。感謝 – mvito

回答

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

這種方式關鍵只是一個「字符」,而不是整個標籤名稱。 – mvito

+0

它的工作原理也是如此,它遵循您對其他發佈的評論。非常感謝 – mvito

0

一種方法是去想過中間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

有幾個拼寫錯誤,它根本不起作用 – mvito