2012-10-18 23 views
19

Potrzebuję komparatora dla mapy drzewa. Czy powinienem to anonimowo napisać w konstruktorze dla mojej mapy drzewa? Jak inaczej mógłbym napisać mój komparator. Obecnie Java nie lubi mojego kodu (mogę to zrobić anonimowo):Komparator 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. mogę zrobić powyższe anonimowo?
  2. Jak inaczej mogę to zrobić?
  3. Chcę uporządkować MyMap przez wartość nie klucz

Odpowiedz

42

nie można sortować TreeMap na wartości.

Implementacja NavigableMap na podstawie czerwonego drzewa. Mapa jest sortowana według naturalnej kolejności jej kluczy lub komparatora dostarczonego w czasie tworzenia mapy, w zależności od tego, który konstruktor jest używany. Musisz podać comparator dla Comparator<? super K>, aby Twój komparator porównywał klucze.

Aby zapewnić sortowanie według wartości, musisz SortedSet. Użyj

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

Aby dać przykład

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

Output:

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

Jak dodawać element pojedynczo do myMap? myMap.add (Map.Entry new Map.Entry (vStr, cur)); – CodeKingPlusPlus

+0

@CodeKingPlusPlus Nie. Używasz tylko metody put Sprawdź przykład, który został dodany. Po wprowadzeniu wartości na mapę, po ich zakończeniu użyj SortedSet do sortowania wartości. –

+0

@AmitDeshpande dzięki za wspaniałą odpowiedź – Kushal

11

Komparator powinien być tylko dla klucza, a nie dla całego wpisu. Sortuje wpisy na podstawie kluczy.

należy go zmienić na coś w następujący sposób

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

Aktualizacja

można coś zrobić w następujący sposób (utworzyć listę wpisów w mapie i uporządkować bazę wykaz na wartości, ale Warto zauważyć, że nie zamierza się rozwiązać sam MAP) -

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: Nie można posortować samej mapy na podstawie wartości. Ale możesz uzyskać listę wpisów i posortować ją. Ale może nie mieć sensu posiadanie mapy drzewa, chyba że zmienisz klucz i wartość. –

0

można trzepnąć klucz i wartość. Na przykład:

 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

To próbuje rozwiązać ostatnie pytanie, ale nie pierwsze dwa. –