我使用自定义比较器来初始化树集,使其成为最小堆。它可以很好地删除小数字(例如 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
的实例与 ==
进行比较,但是应用于对象的 ==
仅在它们是同一实例时进行比较。在您的例子中,i1
和 i2
是两个不同的实例,尽管具有相同的值。
使用 equals
方法比较内容,如下所示:
...
} else if (i1,equals(i2)) {
return 0;
...
为什么它适用于小数字:小整数(默认为 -128 到 127)由 Integer
类缓存,以避免每次需要时都创建一个新实例。详情:Integer.valueOf(int)
关于java - 比较器不会删除 TreeSet 中的数字重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41725174/