Java中的IEqualityComparer接口

Fak*_*een 13 java collections

更具体地说,我想要一个接口来比较对象,这些对象只能进行相等性比较[例如复数],但不能对它们进行总排序.它应该[注意它只返回一个布尔值是/否]

boolean Equals(T object1, T object2);
Run Code Online (Sandbox Code Playgroud)

和哈希码函数.因此,当我使用对象分配它们来收集"相等"对象时,2个"相等"对象不会在两个不同的桶中结束.

int getHashCode(T object);
Run Code Online (Sandbox Code Playgroud)

Java有一个吗?我搜索过,找不到它.

我试图在Hadoop Map Reduce中使用它来将"相等"对象分发到同一个reduce作业,这样我就可以操作所有"相等"的对象.我只关心对象是否相等而且不需要总订单.但是如果两个对象相等,则它们应该具有相同的哈希码.否则他们将最终完成两个不同的减少工作.

请注意,我知道对象的equals和hashcode.但我想要一个外部比较器,它只取决于对象的一部分.因此,对象的平等概念与我的不同.

Jon*_*eet 10

在Java中没有用于此的内置类型.这是IMO系列设计中的"漏洞".我担心的是特定于字符串的Collat​​or类,它的范围非常接近.

没有办法自定义内置映射以使用特定类型的相等比较,运气更糟.想要这个功能是完全合理的,而且真正的痛苦还没有出现.

您当然可以创建自己的这样的界面,并编写自己的地图变体使用它...但必须这样做很糟糕:(


Kev*_*ion 7

你想要的类型是番石榴Equivalence.但是,您可能会感到失望,就像在Java中一样Collection,Map并且相当严格地指定Object.equals,并且您将找不到使用备用等效的Guava中的实现.但是,您可以模拟该行为myEquivalence.wrap(myObject).