2012-10-18 76 views
19

我需要一個TreeMap的比較器。我應該在我的TreeMap的構造函數中匿名寫這個嗎?我還能怎樣寫我的比較器。目前,Java不喜歡我的代碼(我可以做到這一點匿名):Java TreeMap比較器

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>() 
    { 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) 
     { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
  1. 我能做到上面匿名?
  2. 我該怎麼辦?
  3. 我想價值排序MYMAP不是關鍵

回答

42

你不能在價值排序TreeMap

基於紅黑樹的NavigableMap實現。地圖根據其按鍵的自然順序或地圖創建時提供的比較器進行排序,具體取決於使用哪個構造函數 您需要爲Comparator<? super K>提供comparator,以便您的比較器在按鍵上進行比較。

要提供排序值,您將需要SortedSet。使用

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
      new Comparator<Map.Entry<String, Double>>() { 
       @Override 
       public int compare(Map.Entry<String, Double> e1, 
         Map.Entry<String, Double> e2) { 
        return e1.getValue().compareTo(e2.getValue()); 
       } 
      }); 

    sortedset.addAll(myMap.entrySet()); 

給你舉個例子

SortedMap<String, Double> myMap = new TreeMap<String, Double>(); 
    myMap.put("a", 10.0); 
    myMap.put("b", 9.0); 
    myMap.put("c", 11.0); 
    myMap.put("d", 2.0); 
    sortedset.addAll(myMap.entrySet()); 
    System.out.println(sortedset); 

輸出:

[d=2.0, b=9.0, a=10.0, c=11.0] 
+0

如何向我的地圖一次添加一個元素? myMap.add(Map.Entry new Map.Entry (vStr,cur)); – CodeKingPlusPlus

+0

@CodeKingPlusPlus您只使用put方法檢查添加的示例。一旦完成使用SortedSet對值進行排序,您就可以將值賦予Map。 –

+0

@AmitDeshpande感謝超級回答 – Kushal

11

比較應該只爲關鍵,不是針對整個項目。它根據密鑰對條目進行排序。

如下你應該改變它的東西

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>() 
    { 
     public int compare(String o1, String o2) 
     { 
      return o1.compareTo(o2); 
     } 
}); 

更新

你可以做一些事情如下(在地圖上創建條目列表和排序值列表的基礎,但注意,這不會對地圖本身)進行排序 -

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet()); 
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() { 
     @Override 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
+0

@CodeKingPlusPlus:你不能根據值對地圖本身進行排序。但是,您可以獲取條目列表並對其進行分類。但是,除非您切換鍵和值,否則可能沒有意義擁有TreeMap。 –

0

可以刷卡鍵和值。例如

 String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"}; 
     int[] v = {341, 273, 278, 329, 445}; 
     TreeMap<Integer,String>a=new TreeMap(); 
     for (int i = 0; i < k.length; i++) 
      a.put(v[i],k[i]);    
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
     a.remove(a.firstEntry().getKey()); 
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
+1

這是試圖解決最後一個問題,但不是前兩個。 –