在 Scala 中将映射序列转换为键映射到值序列
Transform Sequence of Maps into Map of Keys to Sequences of Values in Scala
我正在尝试转换一系列地图,例如
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 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
。然后它将映射条目分组到它们的键上。最后,您将值(现在是映射条目列表)映射到映射值列表。