scala foldLeft和地图地图
我有一张像这样的地图scala foldLeft和地图地图,scala,Scala,我有一张像这样的地图 val v=Map(“A”->Map(“C”->“D”,“F”->“G”),“B”->Map(“C”->“E”,“M”->“N”) 我必须创建一个新的地图,它将有一系列的价值地图和它们的父母,所以我的结果地图看起来像 Map(“C”->List(“A”->Map(“C”->D”,“F”->G”),“B”->Map(“C”->E”,“M”->N”),“F”->List(“A”->Map(“C”->D”,“F”->G”),“M”->List(“B”->Map(“C”->E”,“
val v=Map(“A”->Map(“C”->“D”,“F”->“G”),“B”->Map(“C”->“E”,“M”->“N”)
我必须创建一个新的地图,它将有一系列的价值地图和它们的父母,所以我的结果地图看起来像
Map(“C”->List(“A”->Map(“C”->D”,“F”->G”),“B”->Map(“C”->E”,“M”->N”),“F”->List(“A”->Map(“C”->D”,“F”->G”),“M”->List(“B”->Map(“C”->E”,“M”->N”)
foldleft能做到这一点吗?我知道这让人困惑,但我们将感谢您的帮助。是的,可以用
foldleft
完成
我不知道为什么会有列表,因为每个列表
都有一个映射
作为一个元素。不是更多,不是更少
无论如何
我使用折叠值
(它们是v
的映射),这样我可以更快地访问那些映射的键
。我扔掉所有键
,它们已经在acc
中,所以不会有任何重复计算。(元素键.过滤器(!acc.isDefinedAt())
)
然后,对于尚未在结果中的每个键
,遍历原始v
,并查看它作为键出现在值映射中的位置。(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))))