【发布时间】:2011-06-17 18:59:17
【问题描述】:
更具体地说,我想要一个接口来比较只能比较是否相等的对象[例如复数],但它们没有总顺序。 它应该有 [注意它只返回一个布尔值是/否]
boolean Equals(T object1, T object2);
和一个哈希码函数。因此,当我使用对象将它们分配到桶中时说收集“相等”的对象,2个“相等”的对象不会最终出现在两个不同的桶中。
int getHashCode(T object);
Java 有吗?我搜了没找到。
我正在尝试在 Hadoop Map Reduce 中使用它来将“相等”的对象分配给同一个 reduce 作业,以便我可以对所有“相等”的对象进行操作。我只关心对象是否相等,不需要全序。但是如果两个对象相等,它们应该具有相同的哈希码。否则他们最终会从事两个不同的 reduce 工作。
请注意,我知道对象的等号和哈希码。但我想要一个外部比较器,它说只取决于对象的一部分。所以对象的平等概念和我的不同。
【问题讨论】:
-
我不知道 C# 类比,但你检查过
Object类吗?它有equals()和hashCode()方法。它基本上在每个类中都是继承的(并且是可覆盖的)。 download.oracle.com/javase/6/docs/api/java/lang/Object.html 或者您可能需要Comparator? download.oracle.com/javase/6/docs/api/java/util/Comparator.html -
不 - 我想要一个外部比较器 - 我对“平等”的概念与对象本身的平等不同。假设我只想比较对象的一部分,但对象本身在所有字段上实现相等。
-
标准 java.util 不支持类似的功能。
-
我认为
Comparator无论如何都接近了。它不返回boolean,但您可以检查它是否返回0。 -
@Balsu - 是的 - 那是我的第一次尝试。但不幸的是比较器没有哈希码。所以我不知道如何将对象分配到桶中——因为只有它知道比较器的相等概念,所以我所做的任何分配都可以将相等的对象放入不同的桶中。
标签: java collections