如何确认两个ImmutableMaps在其中具有完全相同(键,值)对?

时间:2014-10-29 09:04:16

标签: java guava

我需要为单元测试做这个。正在测试的方法返回一个ImmutbaleMap,我需要能够将它与我已经拥有的那个进行比较。一种方法是为两个(keySets())获取密钥集,运行它们并比较这两个映射返回的值。然而,对我来说这似乎有点低效。有更好/首选的方法吗?

4 个答案:

答案 0 :(得分:6)

如果密钥和值都正确实现equals(),您只需使用Map.equals()

  

将指定对象与此映射进行相等性比较。如果给定对象也是地图并且两个地图表示相同的映射,则返回true。更正式地说,如果m1,则两个地图m2m1.entrySet().equals(m2.entrySet())代表相同的映射。这可确保equals方法在Map接口的不同实现中正常工作。

如果他们不这样做,我怀疑你会找到一个开箱即用的单线程。我希望你必须自己实施比较。这并不难:

  • 如果两个密钥集之间的symmetric difference不为空,那么就完成了。
  • 否则,迭代一个地图,在另一个地图中查找相同的密钥并比较这些值(使用适当的比较方法)。

这可以很容易地封装到辅助函数中,可能由值比较器参数化。

答案 1 :(得分:1)

补充@ NPE的答案......

由于您的值未正确实现.equals() / .hashCode(),因此地图上的简单等号将无效;但你用的是番石榴;因此,您可以选择实施Equivalence

这意味着,如果您的值类为Foo

  • 您需要实施Equivalence<Foo>
  • 您的地图必须是Map<X, Equivalence.Wrapper<Foo>>

有了这个,您就可以使用Map的{​​{1}}。

您必须使用Equivalence的.wrap()方法添加值。有关.equals()实施的示例,请参阅here

答案 2 :(得分:0)

另一个选择是使用普通Map,写出等价的暗示并使用difference

中的Maps方法
MapDifference<K,V> difference(Map<? extends K,? extends V> left,
                                           Map<? extends K,? extends V> right,
                                           Equivalence<? super V> valueEquivalence)

我更喜欢这种方式,因为它不会改变Map类型(不会只是为了计算差异或检查相等性)。

答案 3 :(得分:0)

为什么map1.entrySet().equals(map2.entrySet())不起作用? EntrySet.equals()方法引用的Map.contains()方法应该适用于您的值,无论它们是否实现equals()(在这种情况下,您可能具有IdentityHashMap底层)。