比较器不会删除 TreeSet 中的重复数字
Comparator doesn't remove number duplicates in 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 -2147483647 1 1,我得到 -2147483647 -2147483647 1。我的比较器似乎有问题。我试着调试。当比较-2147483647 和-2147483647 时,比较方法returns 不返回0,而是返回0。有人能告诉我为什么吗?提前致谢!
您正在比较 Integer
与 ==
的实例,但应用于对象的 ==
仅在它们是同一实例时才进行比较。在您的情况下,i1
和 i2
是两个不同的实例,尽管它们具有相同的值。
使用equals
方法比较如下内容:
...
} else if (i1,equals(i2)) {
return 0;
...
为什么它适用于小数字:小整数(默认为 -128 到 127)由 Integer
class 缓存,以避免每次需要时都必须创建一个新实例.详情:Integer.valueOf(int)
当您使用 valueOf()
创建 Integer
时,会缓存从 -128 到 127 的值。这意味着对于这些值范围,使用运算符 ==
进行比较将 return true
如果两个对象具有相同的整数值。对于小于 -128 和大于 127 的整数值不起作用,比较将 return false
用于具有相同值的对象。因此,如果您希望它始终正常工作,请使用 equals()
方法进行比较,而不是 ==
。
我使用了一个自定义的比较器来初始化树集,使其成为一个最小堆。删除小数字(如 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 时,比较方法returns 不返回0,而是返回0。有人能告诉我为什么吗?提前致谢!
您正在比较 Integer
与 ==
的实例,但应用于对象的 ==
仅在它们是同一实例时才进行比较。在您的情况下,i1
和 i2
是两个不同的实例,尽管它们具有相同的值。
使用equals
方法比较如下内容:
...
} else if (i1,equals(i2)) {
return 0;
...
为什么它适用于小数字:小整数(默认为 -128 到 127)由 Integer
class 缓存,以避免每次需要时都必须创建一个新实例.详情:Integer.valueOf(int)
当您使用 valueOf()
创建 Integer
时,会缓存从 -128 到 127 的值。这意味着对于这些值范围,使用运算符 ==
进行比较将 return true
如果两个对象具有相同的整数值。对于小于 -128 和大于 127 的整数值不起作用,比较将 return false
用于具有相同值的对象。因此,如果您希望它始终正常工作,请使用 equals()
方法进行比较,而不是 ==
。