[英]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 Test -2147483647 -2147483647 1 1,則得到-2147483647 -21474836471。我的比較器似乎出了點問題。 我嘗試調試。 比較-2147483647和-2147483647時,compare方法返回1,而不是返回0。有人可以告訴我為什么嗎? 先感謝您!
您正在將Integer
實例與==
進行比較,但是==
應用於對象,僅當它們是同一實例時才進行比較。 在您的情況下, i1
和i2
是兩個不同的實例,盡管它們具有相同的值。
使用equals
方法比較內容,例如:
...
} else if (i1,equals(i2)) {
return 0;
...
為什么使用小數:小整數(默認為-128到127)由Integer
類緩存,以避免每次需要時都創建新實例。 詳細信息: Integer.valueOf(int)
使用valueOf()
創建Integer
將從-128到127的值緩存。 這意味着對於這兩個值范圍,如果兩個對象都具有相同的整數值,則使用運算符==
進行比較將返回true
。 對於小於-128且大於127的整數將不起作用,對於具有相同值的對象,比較將返回false
。 因此,如果要使其始終正常工作,請使用equals()
方法進行比較,而不要使用==
進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.