Java TreeSet<int[]>: 重复元素?

Java TreeSet<int[]>: duplicate elements?

我想在 TreeSet 中有一些 int 对,并按第一个数字对它们进行排序。

代码test here:

public static void main (String[] args) throws java.lang.Exception
{
    SortedSet<int[]> s = new TreeSet<int[]>(new Comparator<int[]>(){
        public int compare(int[] a, int[] b) {
            return b[0] - a[0];
        }
    });
    int[] a = new int[]{1, 2};
    int[] b = new int[]{1, 3};
    s.add(a);
    s.add(b);
    System.out.println(s.size());
}

不知道为什么TreeSet的size是1,好像ab的hashCode是一样的,为什么呢?

感谢您的帮助。

顺便说一句:事实上,我试图将重复的数字放在一个集合中,这是不可能的。然后我试着在一组中有 int 对。第一个数字是我想要的实际数字,第二个数字是为了防止重复。但是我运行遇到了这个问题。

原来是1,因为你的compare方法只用到了数组的第一个数,而你有的两个数组都是1开头的。所以,从TreeSet的角度来看,两个数组是一样的

TreeSet.add returns

true if this set did not already contain the specified element

,并且由于两个值被认为是相等的(compare returns 0),所以不添加第二个值并且 add() returns false

认为哈希码在基于树的数据结构中起作用是一个常见的错误,它实际上并没有基于t.Hash的集合(HashSet,LinkedHashSet,HashMap,LinkedHashMap和其他少数)使用哈希和等号来区分一个对象。

在你的情况下,一个 TreeSet,你正在使用一个比较器来处理对象相等性,该比较器根据数组的长度考虑相等性 sizes.If 两个数组具有相同的大小,在你的情况下它认为 equal.So,数组 b 替换了头节点中的数组 a,因为两个数组的长度都是 1.Even,如果您覆盖 hashcode,它将没有任何用处。

来自 JavaDocs:-

请注意,如果要正确实现 Set 接口,set 维护的顺序(无论是否提供显式比较器)必须与 equals 一致。 (请参阅 Comparable 或 Comparator 以获得与等于一致的精确定义。)之所以如此,是因为 Set 接口是根据 equals 操作定义的,但是 TreeSet 实例使用其 compareTo(或比较)方法执行所有元素比较,因此两个从集合的角度来看,通过此方法被视为相等的元素是相等的。集合的行为是明确定义的,即使它的顺序与 equals 不一致;它只是不遵守 Set 接口的一般合同。