Scala如何将Seq of Pair转移到地图?

时间:2015-12-17 02:37:38

标签: scala

我有一些价值如下:

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())

3 个答案:

答案 0 :(得分:4)

试试这个:

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

答案 1 :(得分:2)

与@Shadowlands类似的方法,但仍然使用for comprehension,从分组中提取和映射键和列表值,如下所示

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

答案 2 :(得分: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())