2012-10-18 7 views
19

Ich brauche einen Komparator für eine TreeMap. Soll ich das anonym im Konstruktor für meine TreeMap schreiben? Wie sonst könnte ich meinen Komparator schreiben. Derzeit unterstützt Java nicht mein Code wie (kann ich das anonym?):Java TreeMap Comparator

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. Kann ich anonym die oben tun?
  2. Wie sonst könnte ich das tun?
  3. Ich möchte durch den Wert sortieren myMap nicht der Schlüssel

Antwort

42

Sie können nicht sortieren TreeMap auf Werte.

Eine rot-schwarze baumbasierte NavigableMap-Implementierung. Die Karte wird nach der natürlichen Reihenfolge ihrer Schlüssel oder nach einem bei der Kartenerstellung angegebenen Komparator sortiert, abhängig davon, welcher Konstruktor verwendet wird. Sie müssen comparator für Comparator<? super K> angeben, damit Ihr Vergleicher die Schlüssel vergleichen kann.

Um Werte sortieren zu können, benötigen Sie SortedSet. Verwenden Sie

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()); 

Ihnen ein Beispiel

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); 

Ausgang zu geben:

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

Wie füge ich ein Element einzeln zu myMap hinzu? myMap.add (Map.Entry new Map.Entry (vStr, cur)); – CodeKingPlusPlus

+0

@CodeKingPlusPlus Nein. Sie verwenden nur die put-Methode Überprüfen Sie das Beispiel, das hinzugefügt wird. Wenn Sie Werte zu Map hinzufügen, verwenden Sie SortedSet, um Werte zu sortieren. –

+0

@AmitDeshpande danke für hervorragende Antwort – Kushal

11

Der Komparator nur für den Schlüssel sein sollte, nicht für den gesamten Eintrag. Es sortiert die Einträge basierend auf den Schlüsseln.

Sie sollten es zu etwas ändern, wie

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

aktualisieren

folgt können Sie etwas tun, wie folgt (eine Liste der Einträge in der Karte erstellen und die Liste Basis auf Wert sortieren, aber beachten Sie dies nicht sortieren werde die Karte selbst) -

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: Sie können die Karte nicht basierend auf Werten sortieren. Aber Sie können eine Liste von Einträgen erhalten und sie sortieren. Aber es macht keinen Sinn, eine TreeMap zu haben, wenn Sie den Schlüssel und den Wert nicht wechseln. –

0

Sie den Schlüssel klauen können und den Wert. Zum Beispiel

 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

Dies versucht, die letzte Frage zu lösen, aber nicht die ersten beiden. –