我有一个像下面的一些值: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'时都会重新计算。 –