繁体   English   中英

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

[英]How do I confirm that two ImmutableMaps have the exact same (key,value) pairs in them?

我需要进行单元测试。 被测试的方法返回一个ImmutbaleMap,我需要能够将其与已有的方法进行比较。 一种方法是获取两个(keySets())的键集,遍历它们并比较从两个映射返回的这些键的值。 但是,对我来说,这似乎效率不高。 有没有更好/更好的方法来做到这一点?

如果键和值均正确实现equals() ,则可以简单地使用Map.equals()

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

如果他们不这样做,我怀疑您会发现一个开箱即用的单线纸。 我希望您必须自己进行比较。 这并不难:

  • 如果两个键集之间的对称差异不为空,则操作完成。
  • 否则,遍历一个映射,在另一个映射中查找相同的键并比较值(使用适当的比较方法)。

可以很容易地将其封装到一个辅助函数中,也许可以通过值比较器对其进行参数设置。

补充@NPE的答案...

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

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

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

这样,您就可以使用Map.equals()

您必须使用Equivalence的.wrap()方法添加值。 有关Equivalence实现的示例,请参见此处

另一个选择是使用普通Map,编写等效的实现,并使用Maps类中的以下difference方法

MapDifference<K,V> difference(Map<? extends K,? extends V> left,
                                           Map<? extends K,? extends V> right,
                                           Equivalence<? super V> valueEquivalence)

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

为什么map1.entrySet().equals(map2.entrySet())不起作用? EntrySet.equals()方法引用Map.contains()方法,无论值是否实现equals() (在这种情况下,您可能都有一个IdentityHashMap作为基础),该方法都应该对您的值起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM