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

标签 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 Test -2147483647 -2147483647 1 1,我会得到 -2147483647 -2147483647 1。我的比较器似乎有问题。我尝试调试。当 -2147483647 和 -2147483647 进行比较时,compare 方法返回 1,而不是返回 0。有人可以告诉我为什么吗?预先感谢您!

最佳答案

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

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

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

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

关于java - 比较器不会删除 TreeSet 中的数字重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41725174/

相关文章:

c - 复制整数数组的 strcopy 函数版本

java - java类中的最终数组实例变量并重置引用

java.lang.Integer 的 Java 反序列化 - 异常

java - 从 Coldfusion 中的 jar 运行 java 类 - NoClassDefFoundError

java - 将 Stax XML 写入 ObjectOutputStream(socket.getOutputStream) 时出现 MalformedByteSequenceException

arrays - 在 O(n) 时间内检查两个子串是否重叠

java ;整数 [] 到整数

c - 为什么-1在内部表示为全1

java - eclipse中类对象的键盘快捷键

java - 为什么方法不返回 true?