我使用自定义比较器来初始化树集,使其成为最小堆。它可以很好地删除重复的小数字,如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。有人可以告诉我为什么?提前谢谢!
答案 0 :(得分:1)
您正在将Integer
与==
的实例进行比较,但应用于对象的==
只会比较它们是否是同一个实例。在您的情况下,i1
和i2
是两个不同的实例,尽管具有相同的值。
使用equals
方法比较内容,如:
...
} else if (i1,equals(i2)) {
return 0;
...
为什么它适用于小数:小整数(默认为-128到127)由Integer
类缓存,以避免每次需要时都必须创建新实例。详情:Integer.valueOf(int)
答案 1 :(得分:0)
When you create an Integer
using 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.