我有一张类似
的地图 val v = Map("A" -> Map("C" -> "D", "F" -> "G"), "B" -> Map("C" -> "E", "M" -> "N"))
我必须创建新的地图,其中包含价值地图及其父母的列表,因此我的结果地图将如下所示
Map("C" -> List(Map("A" -> Map("C" -> "D", "F" -> "G"), "B" -> Map("C" -> "E", "M" -> "N")), "F" -> List(Map("A" -> Map("C" -> "D", "F" -> "G")), "M" -> List("B" -> Map("C" -> "E", "M" -> "N")))
这可以用foldleft来实现。我知道这很令人困惑,但任何帮助都会受到赞赏。
答案 0 :(得分:1)
是的,可以使用foldLeft
完成。
我不知道为什么你有列表,因为每个List
只有一个Map
作为元素。不是更多,而不是更少。
反正。
我使用values
v
(这是地图){@ 1}}的折叠,因此我可以更快地访问这些地图的keys
。我扔掉了keys
中已有的所有acc
,因此不会有任何重复的计算。 (elem.keys.filter(!acc.isDefinedAt(_))
)。
然后,对于尚未在我们的结果key
中的每个acc
,遍历原始v
并在值映射中查看它作为key
的位置。 (v.filter{case (k, map) => map.isDefinedAt(key)})
)
然后将过滤后的地图放入列表中,并将相应的键添加到acc
。
旁注:地图的地图,值的键,键,值... 我不知道如何在不混淆自己的情况下更好地解释这一点。 ..我甚至都不知道应该突出什么......
val v = Map("A" -> Map("C" -> "D", "F" -> "G"), "B" -> Map("C" -> "E", "M" -> "N"))
val result = v.values.foldLeft(Map.empty[String, List[Map[String, Map[String, String]]]])((acc, elem) => {
val nextEntries = elem.keys.filter(!acc.isDefinedAt(_)).map(key =>
key -> List(v.filter{case (k, map) => map.isDefinedAt(key)}))
acc ++ nextEntries
})
println(result) //Map(C -> List(Map(A -> Map(C -> D, F -> G), B -> Map(C -> E, M -> N))), F -> List(Map(A -> Map(C -> D, F -> G))), M -> List(Map(B -> Map(C -> E, M -> N))))