比较器不会删除TreeSet中的数字重复项

时间:2017-01-18 16:57:14

标签: java arrays integer heap comparator

我使用自定义比较器来初始化树集,使其成为最小堆。它可以很好地删除重复的小数字,如1,2,3。但是当数字很大时,重复项保留在树集中。这是我的代码:

public class Test { 
    public static void main(String[] args) { 
            Set<Integer> treeset = new TreeSet<>(new MyComparator()); 
            Integer[] array = new Integer[args.length]; 
            for (int i = 0 ; i < args.length ; i ++ ) { 
                    array[i] = Integer.valueOf(args[i]); 
                    treeset.add(array[i]); 
            } 
            for (Integer i : treeset) { 
                    System.out.print(i + " "); 
            } 
    } 

    public static class MyComparator implements Comparator<Integer> { 
            @Override 
            public int compare(Integer i1, Integer i2) { 
                    if (i1 < i2) { 
                            return -1; 
                    } else if (i1 == i2) { 
                            return 0; 
                    } else { 
                            return 1; 
                    } 
            } 
    } 

}

如果我做java测试-2147483647 -2147483647 1 1,我得到-2147483647 -2147483647 1.我的比较器似乎有问题。我试着调试。当比较-2147483647和-2147483647时,比较方法返回1.而不是返回0。有人可以告诉我为什么?提前谢谢!

2 个答案:

答案 0 :(得分:1)

您正在将Integer==的实例进行比较,但应用于对象的==只会比较它们是否是同一个实例。在您的情况下,i1i2是两个不同的实例,尽管具有相同的值。

使用equals方法比较内容,如:

...
                } else if (i1,equals(i2)) { 
                        return 0; 
...

为什么它适用于小数:小整数(默认为-128到127)由Integer类缓存,以避免每次需要时都必须创建新实例。详情:Integer.valueOf(int)

答案 1 :(得分:0)

When you create an Integerusing valueOf() values from -128 to 127 are cached. This means for these range of values using the operator == for comparison will return true if both objects have the same integer value. For integer values less than -128 and greater than 127 that will not work, comparison will return false for objects having the same value. So use the equals() method for comparison instead of == if you want it to work correctly all the time.