如何覆盖数组的equals方法?

时间:2015-07-14 16:29:54

标签: java arrays set

Set和List之间的主要区别在于set不允许重复。因此,我试图创建一个List<Integer[]>,而不是两个元素相等,而不是Set<Integer[]>。但是当我阅读Set<Integer[]>

时,我得到了以下结果
[0, 4, 5]
[3, 4, 1]
[4, 5, 0]
[0, 3, 6]
[1, 3, 4]
[1, 2, 7]

对于我的实施,[0, 4, 5][4, 5, 0]被认为是平等的。因此我的问题是:有没有办法覆盖Integer[]的equals方法,以便set函数的add方法可以避免同时接纳[0, 4, 5][4, 5, 0]

4 个答案:

答案 0 :(得分:6)

无法覆盖数组中的任何方法。但是你并没有试图覆盖数组中的方法,你真正想做的是防止Set中的重复。

因此,正如@nneonneo建议的那样,正确的做法是使用除数组之外的其他东西。数组本身就具有对其元素的顺序,这意味着你正在努力使用Set<Integer[]>进行艰苦的战斗。你有三个更好的选择:

  1. 使用没有固有顺序的数据结构,例如HashSet
  2. 使用保留固有顺序的数据结构,例如TreeSetTreeMultiset in Guava
  3. 使用覆盖.equals()比较的自定义对象,wraps数组。
  4. 然后,您的目标集在每种情况下分别为Set<Set<Integer>>Set<Multiset<Integer>>Set<MyWrapper>

    出于性能原因,我建议您为Comparator使用自定义Set 未排序数组 。排序数据结构可以在O(n)Integer比较中进行相等比较,但是未排序的数据结构在初始情况下至少需要O(n log n)。但是,如果由于某种原因必须使用数组,那么该解决方案将起作用。这就是我在上面的“艰苦战斗”中的意思。

答案 1 :(得分:5)

简短回答:你不能。根本没有机制可以覆盖数组类中的任何内容。

相反,请考虑为您的对象使用替代容器。您可以使用Set<Integer>作为对象,创建Set<Set<Integer>>,因为您似乎想要进行无顺序比较。

或者,对于更精细的控制,请考虑使用自己的类来包装数组或集合,例如Set<MyIntegerBag>。然后,您将完全控制所使用的比较操作。

答案 2 :(得分:3)

将java.util.TreeSet与一个Comparator一起使用,该Comparator为您认为相同的两个数组返回零,否则遵循任何一致的排序规则。

根据T reeSet documentation,“TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度看,这个方法认为相等的两个元素相等。集合的行为即使其排序与equals不一致也是明确定义的;它只是不遵守Set接口的一般契约。“

答案 3 :(得分:0)

与两个数组完全比较的一种方法是使用方法:

Integer[]arrayOne, arrayTwo;
//Arrays get set with contents, etc. 
Arrays.equals(arrayOne, array2);

equals方法按顺序比较每个项目以及数组的大小。

这来自一个类似问题:How to overide equals for array in Java?在该示例中,他们使用了采用原始数组类型的方法,但您可以使用Object []中的方法。