scala foldLeft与地图的地图

时间:2014-06-10 22:58:15

标签: scala

我有一张类似

的地图

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来实现。我知道这很令人困惑,但任何帮助都会受到赞赏。

1 个答案:

答案 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))))