簡體   English   中英

比較器在TreeMap中創建重復項

[英]Comparator creates duplicates in TreeMap

我想按值對我的HashMap (或TreeMap )進行排序。 我通過創建一個按值排序的自定義Comparator來實現這一點。 但是,每當我再次從HashMap輸入所有條目時,都會得到重復。

如何按值排序而不創建重復項?

public class Test {
    public static void main(String[] args) {

        HashMap<Integer, String> hMap = new HashMap<Integer, String>();
        ValueComparator vc = new ValueComparator(hMap);
        TreeMap<Integer, String> tMap = new TreeMap<Integer, String>(vc);

        hMap.put(0, "b");
        hMap.put(1, "c");
        hMap.put(2, "a");
        tMap.putAll(hMap);
        tMap.putAll(hMap);

        for (Map.Entry<Integer, String> entry : tMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }
}

class ValueComparator implements Comparator<Integer> {
    Map<Integer, String> base;

    public ValueComparator(Map<Integer, String> base) {
        this.base = base;
    }

    public int compare(Integer a, Integer b) {
        if (base.get(a).charAt(0) >= base.get(b).charAt(0))
             return 1;
        else return -1;
    }
}

OUTPUT

2 a
2 a
0 b
0 b
1 c
1 c

如果兩個對象相等,則compare方法應返回0 在您的實現中,您將返回1 ,因此映射無法正確識別重復項。

解決此問題的一種方法是重用Character.compare比較兩個char

public int compare(Integer a, Integer b) {
    return Character.compare
              (base.get(a).charAt(0), base.get(b).charAt(0));
}

您需要按如下所示修改邏輯,處理-1, 0 and 1所有三種情況

public int compare(Integer a, Integer b) {
        if (base.get(a).charAt(0) == base.get(b).charAt(0))
            return 0;

        else if (base.get(a).charAt(0) > base.get(b).charAt(0))
            return 1;

        else
            return -1;
    }

產量

2 a
0 b
1 c

您的比較者合同錯誤。 比較方法合同說:

比較其兩個參數的順序。 當第一個參數小於,等於或大於第二個參數時,返回負整數,零或正整數。

您的代碼僅執行1和-1,那么0呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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