如何根据内部地图的键对嵌套地图进行分组?
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)))
)
)
答案 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))
// )