如何覆盖数组的equals方法?

Kat*_*lon 1 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]
Run Code Online (Sandbox Code Playgroud)

对于我的实现,[0, 4, 5]并且[4, 5, 0]被认为是相等的.因此我的问题是:有没有办法覆盖equals方法,Integer[]以便addset函数的方法可以避免同时接纳[0, 4, 5][4, 5, 0]

dur*_*597 6

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

因此,正如@nneonneo建议的那样,正确的做法是使用除数组之外的其他东西.阵列固有地对它们的元素有秩序,这意味着你正在努力使用一场艰苦的战斗Set<Integer[]>.你有三个更好的选择:

  1. 使用没有固有顺序的数据结构,例如 HashSet
  2. 使用确实保留固有顺序的数据结构,例如TreeSetTreeMultiset在Guava中
  3. 使用覆盖.equals()比较的自定义对象来包装数组.

然后,您的目标集将分别为a Set<Set<Integer>>或a Set<Multiset<Integer>>或a Set<MyWrapper>.


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


nne*_*neo 5

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

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

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