我有一些价值如下:
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())
答案 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())