簡體   English   中英

比較器不會刪除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 Test -2147483647 -2147483647 1 1,則得到-2147483647 -21474836471。我的比較器似乎出了點問題。 我嘗試調試。 比較-2147483647和-2147483647時,compare方法返回1,而不是返回0。有人可以告訴我為什么嗎? 先感謝您!

您正在將Integer實例與==進行比較,但是==應用於對象,僅當它們是同一實例時才進行比較。 在您的情況下, i1i2是兩個不同的實例,盡管它們具有相同的值。

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM