根据内部地图的关键字对嵌套地图进行分组

时间:2019-08-15 05:10:50

标签: scala

如何根据内部地图的键对嵌套地图进行分组?

  Map(
      "v1" -> Map("p1" -> List(3, 4),"p2" -> List(8, 10)),
      "v2" -> Map("p1" -> List(5, 6), "p2" -> List(11, 12))
    )

预期输出:

Map(
   "p1" -> Map("v1" -> List(3, 4), "v2" -> List(5, 6)),
   "p2" -> Map("v1" -> List(8, 10), "v2" -> List(11, 12))
)

以此为起点

a.toList.groupBy(_._2.keys)

但按集合分组。

Map(
  Set(p1, p2) -> List(
    (v1, Map(p1 -> List(3, 4), p2 -> List(8, 10))),
    (v2, Map(p1 -> List(5, 6), p2 -> List(11, 12)))
  )
)

1 个答案:

答案 0 :(得分:2)

这是将嵌套的Maps展平为嵌套的Tuples列表,然后通过Maps转换回groupBy/mapValues的一种方法:

val nestedMap = Map(
  "v1" -> Map("p1" -> List(3, 4), "p2" -> List(8, 10)),
  "v2" -> Map("p1" -> List(5, 6), "p2" -> List(11, 12))
)

nestedMap.toList.
  flatMap{ case (v, m) => m.map{ case (p, ls) => (p, (v, ls)) } }.
  groupBy(_._1).mapValues(_.map(_._2).toMap)
// res1: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,List[Int]]] = Map(
//   p2 -> Map(v1 -> List(8, 10), v2 -> List(11, 12)),
//   p1 -> Map(v1 -> List(3, 4), v2 -> List(5, 6))
// )