2017-06-14 61 views
1

可以說我有以下列表:斯卡拉轉換地圖列表基於地圖鍵映射列出

val myList = List(Map(1 -> 1), Map(2 -> 2), Map(2 -> 7))

我想這個列表轉換爲Int的單一地圖 - >目錄(智力)。如果我們有重複的鍵,那麼這兩個值應該包含在結果值列表中。

Map(2 -> List(7,2),1 -> List(1)) 

我想出了這個工作解決方案,但它似乎過度和笨重。

myList.foldLeft(scala.collection.mutable.Map[Int,List[Int]]()) {(result,element) => 
     for((k,v) <- element) { 
     if (result.keySet.contains(k)) { 
      result(k) = result(k).:: (v) 
     } else { 
      result += (k -> List(v)) 
     } 
     } 
     result 
    } 

這裏有更好或更有效的方法嗎?

回答

4
myList 
    .flatten 
    .groupBy(_._1) 
    .mapValues(_.map(_._2)) 
1

您可以使用一個簡單(但可能效率較低)代碼:

val myList = List(Map(1 -> 1), Map(2 -> 2), Map(2 -> 7)) 
val grouped = myList.flatMap(_.toList).groupBy(_._1).mapValues(l => l.map(_._2)) 
println(grouped) 

地圖(2 - >列表(2,7),1 - >列表(1))

這個想法是首先得到List所有元組Map s中的所有元組,然後對它們進行分組。