IEqualityJava中的Comparer接口

2022-09-04 02:03:31

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

boolean Equals(T object1, T object2);

和哈希码函数。因此,当我使用对象说收集“相等”对象将它们分发到存储桶中时,2个“相等”对象不会最终位于两个不同的存储桶中。

int getHashCode(T object);

Java有吗?我搜索了一下,找不到它。

我试图在Hadoop Map Reduce中使用它来将“相等”对象分发到相同的reduce作业,以便我可以对所有“相等”对象进行操作。我只关心对象是否相等,不需要总顺序。但是,如果两个对象相等,它们应该具有相同的哈希代码。否则,他们最终将从事两种不同的减少工作。

请注意,我知道对象的等于和哈希码。但是我想要一个外部比较器,它只依赖于对象的一部分。因此,对象的平等概念与我的不同。


答案 1

在Java中没有用于此目的的内置类型。这是系列设计中的一个“洞”,IMO。恐怕有一个特定于字符串的 Collator 类,它几乎与它所得到的一样接近。

没有办法自定义内置地图以使用特定类型的平等比较,运气更差。想要这个功能是完全合理的,而且它还没有出现。这是一个真正的痛苦。

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


答案 2

你想要的类型是番石榴的等价物。但是,您可能会感到失望,就像在Java中一样,并且在方面相当严格地指定,并且您不会找到Guava中使用替代等价物的实现。但是,您可以使用 来模拟该行为。CollectionMapObject.equalsmyEquivalence.wrap(myObject)