Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较器不会删除树集合中的重复数_Java_Arrays_Integer_Heap_Comparator - Fatal编程技术网

Java 比较器不会删除树集合中的重复数

Java 比较器不会删除树集合中的重复数,java,arrays,integer,heap,comparator,Java,Arrays,Integer,Heap,Comparator,我使用了一个自定义的比较器来初始化treeset,使它成为一个最小的堆。它可以很好地删除小数字的重复项,例如1、2、3。但当数字较大时,重复项仍保留在树集中。这是我的密码: public class Test { public static void main(String[] args) { Set<Integer> treeset = new TreeSet<>(new MyComparator()); I

我使用了一个自定义的比较器来初始化treeset,使它成为一个最小的堆。它可以很好地删除小数字的重复项,例如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-214748364711,我得到-2147483647-214748364711。我的比较仪好像有点问题。我试着调试。比较-2147483647和-2147483647时,compare方法返回1,而不是返回0。有人能告诉我为什么吗?提前谢谢你

您正在比较应用于对象的Integer实例与==,但是==,仅当它们是同一实例时才进行比较。在您的例子中,i1和i2是两个不同的实例,尽管它们具有相同的值

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

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

为什么它使用小数字:默认情况下,Integer类缓存128到127的小整数,以避免每次需要时都必须创建新实例。详细信息:

当您创建一个整数时,将缓存-128到127之间的值。这意味着,对于这些值范围,如果两个对象具有相同的整数值,则使用运算符==进行比较将返回true。对于不起作用的小于-128且大于127的整数值,对于具有相同值的对象,比较将返回false。因此,如果您想让它一直正常工作,请使用equals方法进行比较,而不是==方法。

非常棒的解释!非常感谢。