假设我们有两个ListMap
:
val m1 = new ListMap() + ("a" -> 1, "b" -> 2)
val m2 = new ListMap() + ("c" -> 3, "b" -> 0)
我想合并它们,首选第二张地图中的值。我希望最后一个ListMap
的顺序保留元素的顺序,从第一个到最后,从第一个图到第二个,但是-当出现冲突时,最好选择第一个图的顺序。订购以上地图的结果应如下所示:
ListMap[String,Int] = Map(a -> 1, b -> 0, c -> 3)
这些解决方案不有效,并且不是我想要的 :
m1 + ("c" -> 3) + ("b" -> 0)
res2: immutable.ListMap[String,Int] = Map(a -> 1, c -> 3, b -> 0)
m1 ++ m2
res3: immutable.ListMap[String,Int] = Map(a -> 1, c -> 3, b -> 0)
答案 0 :(得分:2)
您可以通过map
和filter
ing操作来做到这一点:
def merge[A, B](m1: Map[A, B], m2: Map[A, B]): Map[A, B] = {
// Retain k, v ordering from m1, replacing the v with m2's v if appropriate
m1.map {
case (k, v) => k -> m2.getOrElse(k, v)
} ++
// Append the elements in m2 which aren't in m1
m2.filterKeys(!m1.keySet(_))
}
产生
scala> merge(m1, m2)
res17: Map[String,Int] = Map(a -> 1, b -> 0, c -> 3)