2014-12-06 106 views
1

我想按值排序我的HashMap(或TreeMap)。我通過創建一個自定義Comparator來達到這個目的。但是,無論何時我再次輸入HashMap的所有輸入項,我都會得到重複項。比較器在TreeMap中創建副本

如何根據值排序而不創建重複項?

CODE

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 
+0

您的輸入是什麼?你爲什麼要比較第0個字符,在你的情況下是否可行的比較?爲什麼在平等而不是0的情況下返回1? – 2014-12-06 15:57:16

+0

這只是我的問題的演示。但正如你所說,我並沒有完全實現比較器! – TomTom 2014-12-06 16:08:46

回答

1

您需要如下修改邏輯,處理所有三種情況-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

compare方法應返回0如果兩個對象是相等的。在您的實施中,您將返回1,因此地圖無法正確識別重複項。要解決這個

一種方法是重用Character.compare比較兩個char S:

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

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

比較它的兩個參數的順序。由於第一個參數小於,等於或大於第二個參數,因此返回負整數,零或正整數。

你的代碼只做1和-1 那麼0呢?