如何合并两个具有保留元素顺序的ListMap?

时间:2018-11-15 22:23:43

标签: scala

假设我们有两个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)

1 个答案:

答案 0 :(得分:2)

您可以通过mapfilter 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)