如何使用第一个地图中的键和合并值将两个地图合并为一个?

时间:2012-03-09 21:14:26

标签: scala

如何从两张地图地图创建一个新地图,以便生成的地图仅包含相同位置的匹配项,并组合内部地图。

Iterable[Map[String, Map[String,Float]]

示例:

val map1 = Iterable(Map(
  1 -> Map(key1 -> val1), 
  2 -> Map(key2 -> val2), 
  3 -> Map(key3 -> val3)
))

val map2 = Iterable(Map(
  1 -> Map(key11 -> val11), 
  3 -> Map(key33 -> val33), 
  4 -> Map(key44 -> val44), 
  5 -> Map(key55 -> val55)
))

我希望得到的地图如下:

Map(
  1 -> Map(key1 -> val1, key11 -> val11), 
  3 -> Map(key3 -> val3, key33 -> val33)
)

3 个答案:

答案 0 :(得分:10)

更新:我真的不明白您对Iterable的修改意味着什么,或评论中的错误,但这里是StringFloat s的完整工作示例:

val map1: Map[Int, Map[String, Float]] = Map(
  1 -> Map("key1" -> 1.0F),
  2 -> Map("key2" -> 2.0F),
  3 -> Map("key3" -> 3.0F))

val map2: Map[Int, Map[String, Float]] = Map(
  1 -> Map("key11" -> 11.0F),
  3 -> Map("key33" -> 33.0F), 
  4 -> Map("key44" -> 44.0F),      
  5 -> Map("key55" -> 55.0F))

val map3: Map[Int, Map[String, Float]] = for {
  (k, v1) <- map1
  v2 <- map2.get(k)
} yield (k, v1 ++ v2)

更新以回应您的问题:拥有一个地图列表并没有多大意义,每个地图都包含一个映射。您可以使用reduceLeft

轻松地将它们组合到一个地图中
val maps = List(
  Map(1216 -> Map("key1" -> 144.0F)),
  Map(1254 -> Map("key2" -> 144.0F)),
  Map(1359 -> Map("key3" -> 144.0F))
)

val bigMap = maps.reduceLeft(_ ++ _)

现在你有一个大的整数映射到字符串到浮点数的映射,你可以插入上面的答案。

答案 1 :(得分:6)

val keys = map1.keySet & map2.keySet
val map3 = keys.map(k => k -> (map1(k) ++ map2(k)))

答案 2 :(得分:0)

我一直在玩类似的东西,将Seq(Map("one" -> 1), Map("two" -> 2))转换为Map("one" -> 1, "two" -> 2)

我一直在寻找以前的答案,并认为这太难了。玩了一下之后,我发现这个解决方案很有效,很简单:

val seqOfMaps = Seq(Map("one" -> 1), Map("two" -> 2))
seqOfMaps: Seq[scala.collection.immutable.Map[String,Int]] = List(Map(one -> 1), Map(two -> 2))

val allInOneMap = seqOfMaps.flatten.toMap
allInOneMap: scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2)

这种方法的优点是可以自动过滤掉可能的空地图。