将映射序列转换为Scala中值序列的键映射
我试着转动一系列的地图,比如说将映射序列转换为Scala中值序列的键映射,scala,transformation,Scala,Transformation,我试着转动一系列的地图,比如说 val input = Seq(Map("a" -> 1, "b" -> 2), Map("a" -> 10, "c" -> 30), Map("b" -> 200, "c" -> 300, "d" -> 400)) 从这些映射中的键到它们在原始序列中的每个映射中映射到的值序列的映射 因此,上述内容应转化为 val output = Map("a" -&g
val input = Seq(Map("a" -> 1, "b" -> 2),
Map("a" -> 10, "c" -> 30),
Map("b" -> 200, "c" -> 300, "d" -> 400))
从这些映射中的键到它们在原始序列中的每个映射中映射到的值序列的映射
因此,上述内容应转化为
val output = Map("a" -> Seq(1, 10),
"b" -> Seq(2, 200),
"c" -> Seq(30, 300),
"d" -> Seq(400))
我可以想出一些方法来实现这一点,但我正在寻找一种适合这种转换的惯用或最佳scala风格的解决方案?理想情况下不会浪费,但性能不是一个大问题
谢谢 您可以这样做:
val output = input.flatten.groupBy(_._1).mapValues(_.map(_._2))
它将首先将地图展平为所有地图条目的Seq
。然后,它将地图条目分组到它们的键上。最后,将值(现在是映射项列表)映射到映射值列表。您可以执行以下操作:
val output = input.flatten.groupBy(_._1).mapValues(_.map(_._2))
它将首先将地图展平为所有地图条目的
Seq
。然后,它将地图条目分组到它们的键上。最后,将值(现在是映射项列表)映射到映射值列表。您只需使用展平
,而不是展平映射(uu.toSeq)
@Tim哦,没错。修正了。你可以使用flatte
而不是flatMap(u.toSeq)
@Tim哦,没错。固定的。