【问题标题】:Compare two Maps in Scala比较 Scala 中的两个地图
【发布时间】:2019-02-26 14:36:12
【问题描述】:

是否有任何预定义的函数可以用来根据键比较两个地图并给出差异?现在,我迭代 Map1 和 foreach 键,检查 Map2 中是否有元素,然后进行模式匹配以找出差异。有没有更优雅的方法来做到这一点?

【问题讨论】:

  • 显示模式匹配代码
  • 类似于this question,虽然这还没有一个好的答案。

标签: scala scala-collections


【解决方案1】:

考虑转换成元组集的映射之间的差异,

(m1.toSet diff m2.toSet).toMap

【讨论】:

  • 请记住,您从 diff 方法获得的输出将根据您在哪个对象上调用 diff 方法而有所不同,即 m2.toSet diff m1.toSet 会产生不同的结果。跨度>
【解决方案2】:

试试:

val diff = (m1.keySet -- m2.keySet) ++ (m2.keySet -- m1.keySet)

diff 包含在m1 中但不在m2 中的元素,以及在m2 中但不在m1 中的元素。

【讨论】:

  • -- 在 2.9 中已弃用,我认为已从 2.10 中删除,您应该使用 m1.keySet.filterNot(m2.keySet)
  • 真的吗?它在 2.11.5 中:scala-lang.org/api/2.11.5/…
【解决方案3】:

这个解决方案看起来很正确:

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

【讨论】:

    【解决方案4】:

    我认为-- 运算符会满足您的需求:http://www.scala-lang.org/api/current/index.html#scala.collection.Map@--(xs:scala.collection.GenTraversableOnce[A]):Repr

    虽然这可能只在假设 Map2 始终是 Map1 的子集的情况下才有效...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2014-09-08
      • 2021-04-26
      • 1970-01-01
      • 2011-07-20
      • 2017-10-24
      • 2021-07-19
      相关资源
      最近更新 更多