2013-08-28 39 views
1

我想弄清楚如何使用groupBy將元組列表轉換爲地圖。比方說,我檢索從數據庫列表是這樣的:由如何將List [Tuple2 [X,Y]]轉換爲Map [X,List [Y]]以避免Scala中的重複?

val results: List[(Author, Book)] = getAuthorAndBook() 

以來,作者可能已經寫過很多書,我可能與此列表中不同的書同一作者,所以我想組書籍作者並擁有一個Map [作者,列表[Book]]來代替。

我該如何做到這一點?

我知道我必須組,但隨後在那之後,我不太清楚如何應對圖書

results.groupBy(_._1) // and then what ? 

任何幫助,將不勝感激。

謝謝你們

回答

2

你可以這樣做:

results.groupBy(_._1).mapValues(_.map(_._2)) 

GROUPBY根據所需的密鑰的地圖,但這些值仍然在他們的鑰匙,他們是列表[(X,Y)]而不是List [Y]。 mapValues調用修復了這個問題。

+0

只是想了很多,謝謝:) REPL絕對是我的朋友;) – kaffein

-1

有一個內置函數可用於Tuple2列表。

val list = List((1,"toto") , (2,"test")) 
list: List[(Int, java.lang.String)] = List((1,toto), (2,test)) 

list.toMap 
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,toto), (2,test)) 

你不需要wingedsubmariner建議,它已經爲你處理。

+0

如果作者寫了多本書,不起作用。該值需要是每個元組的第二項列表.'val list = List((1,「toto」),(2,「test」),(2,「wibble」)); //> list:List [(Int,String)] = List((1,toto),(2,test),(2,wibble)) val r = list.toMap;//> r:scala.collection.immutable.Map [Int,String] = Map(1 - > toto,2 - > wibble)' –

+0

沒錯,對不起,我以爲這是要得到一個'Map [Int,字符串]'而不是'Map [Int,List [String]]' –

相關問題