【发布时间】:2019-02-26 14:36:12
【问题描述】:
是否有任何预定义的函数可以用来根据键比较两个地图并给出差异?现在,我迭代 Map1 和 foreach 键,检查 Map2 中是否有元素,然后进行模式匹配以找出差异。有没有更优雅的方法来做到这一点?
【问题讨论】:
-
显示模式匹配代码
-
类似于this question,虽然这还没有一个好的答案。
是否有任何预定义的函数可以用来根据键比较两个地图并给出差异?现在,我迭代 Map1 和 foreach 键,检查 Map2 中是否有元素,然后进行模式匹配以找出差异。有没有更优雅的方法来做到这一点?
【问题讨论】:
考虑转换成元组集的映射之间的差异,
(m1.toSet diff m2.toSet).toMap
【讨论】:
试试:
val diff = (m1.keySet -- m2.keySet) ++ (m2.keySet -- m1.keySet)
diff 包含在m1 中但不在m2 中的元素,以及在m2 中但不在m1 中的元素。
【讨论】:
-- 在 2.9 中已弃用,我认为已从 2.10 中删除,您应该使用 m1.keySet.filterNot(m2.keySet)
这个解决方案看起来很正确:
scala> val x = Map(1 -> "a", 2 -> "b", 3 -> "c")
x: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)
scala> val y = Map(1 -> "a", 2 -> "b", 4 -> "d")
y: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 4 -> d)
scala> val diff : Map[Int, String] = x -- y.keySet
diff: Map[Int,String] = Map(3 -> c)
在这里找到它https://gist.github.com/frgomes/69068062e7849dfe9d5a53bd3543fb81
【讨论】:
我认为-- 运算符会满足您的需求:http://www.scala-lang.org/api/current/index.html#scala.collection.Map@--(xs:scala.collection.GenTraversableOnce[A]):Repr
虽然这可能只在假设 Map2 始终是 Map1 的子集的情况下才有效...
【讨论】: