2015-12-17 443 views
3

我有一個像下面的一些值:Scala如何將一對Seq對象映射到一個映射?

Seq((1, Some("one")), (1, Some("two")), (1, Some("three")), (2, Some("four")), (2, Some("five")), (3, None)) 

什麼是轉換成最佳的方式:

Map(1 -> Seq("one", "two", "three"), 2 -> Seq("four", "five"), 3 -> Seq()) 

回答

4

試試這個:

val map = orig_data.groupBy(_._1).mapValues(_.flatMap(_._2)) 
+3

可能想要把嚴格'toList'在該年底,隨着' mapValues'偷偷地返回一個視圖,每次使用val'map'時都會重新計算。 –

1

使用fold另一種解決方案:

scala> seq.foldLeft(Map.empty[Int, Seq[String]].withDefaultValue(Nil)) { 
    | case (m, (k, v)) => m.updated(k, m(k)++v) 
    | } 
res1: scala.collection.immutable.Map[Int,Seq[String]] = 
      Map(1 -> List(one, two, three), 2 -> List(four, five), 3 -> List()) 
2

類似的方法@Shadowlands尚未使用的理解和提取和映射鍵和列表值從分組,這樣

for ((k,xss) <- xs.groupBy(_._1)) yield k -> xss.flatMap(_._2)