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[]
以便add
set函数的方法可以避免同时接纳[0, 4, 5]
和[4, 5, 0]
?
您不能覆盖数组中的任何方法.但是你并没有试图覆盖数组中的方法,你真正想要做的就是防止你的重复Set
.
因此,正如@nneonneo建议的那样,正确的做法是使用除数组之外的其他东西.阵列固有地对它们的元素有秩序,这意味着你正在努力使用一场艰苦的战斗Set<Integer[]>
.你有三个更好的选择:
HashSet
TreeSet
或TreeMultiset
在Guava中.equals()
比较的自定义对象来包装数组.然后,您的目标集将分别为a Set<Set<Integer>>
或a Set<Multiset<Integer>>
或a Set<MyWrapper>
.
我建议对使用自定义Comparator
的无序阵列为您Set
出于性能的考虑.排序的数据结构可以在O(n)Integer
比较中进行相等比较,但是未排序的数据结构在初始情况下至少需要O(n log n).但是,如果由于某种原因必须使用数组,那么该解决方案将起作用.这就是我所说的"艰苦战斗".
简短的回答:你做不到.根本没有机制可以覆盖数组类中的任何内容.
相反,请考虑为您的对象使用替代容器.您可以使用a Set<Integer>
作为对象,创建一个Set<Set<Integer>>
,因为您似乎想要进行无顺序比较.
或者,对于更精细的控制,请考虑使用自己的类来包装数组或集合并具有例如Set<MyIntegerBag>
.然后,您将完全控制所使用的比较操作.
归档时间: |
|
查看次数: |
417 次 |
最近记录: |