我有一個像下面的一些值: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())
我有一個像下面的一些值: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())
試試這個:
val map = orig_data.groupBy(_._1).mapValues(_.flatMap(_._2))
使用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())
類似的方法@Shadowlands尚未使用的理解和提取和映射鍵和列表值從分組,這樣
for ((k,xss) <- xs.groupBy(_._1)) yield k -> xss.flatMap(_._2)
可能想要把嚴格'toList'在該年底,隨着' mapValues'偷偷地返回一個視圖,每次使用val'map'時都會重新計算。 –