2013-02-01 46 views
6

Mam mapę: TreeMap<String, Integer> m = new TreeMap<>(); gdzie mam cały alfabet i wartości, które pokazują, ile razy każda litera została znaleziona w moim tekście.Jak posortować TreeMap <String, Integer>?

Chcę posortować tę mapę w porządku malejącej liczby; oznacza to, że najczęstsza litera znajduje się w pierwszym wierszu, a ostatnia linia wyjścia wskazuje najmniejszą literę. Jeśli dwie litery mają tę samą częstotliwość, najpierw musi pojawić się litera, która jest pierwsza w alfabecie. Jak to zrobić?

Próbowałem z komparatora:

public int compare(String a, String b) { 
     if (base.get(a) >= base.get(b) && a.compareToIgnoreCase(b) < 0) { 
      return -1; 
     } else { 
      return 1; 
     } 
    } 

ale nadal, to nie to, wyjście jest:

D 3 
E 3 
A 2 
S 5 

Guys ... Znalazłem to wcześniej, to nie zrobił pomoc w ogóle. Dobre wyjście powinno być:

S 5 
D 3 
E 3 
A 2 
+0

dokładny duplikat http://stackoverflow.com/questions/3074154/sorting-a-hashmap-based-on-value-then-key – JohnJohnGa

+0

inny duplikat http://stackoverflow.com/questions/1448369/how-to-sort- a-treemap-based-on-its-values ​​ – mellamokb

+0

@JohnJohnGa: nie. Moje pytanie jest trochę inne. Zobacz moją edycję – Katie

Odpowiedz

3

Twój komparator nie wygląda dobrze - to powinno działać lepiej:

public int compare(String a, String b) { 
    if (base.get(a) > base.get(b)) { 
     return -1; 
    } else if (base.get(a) < base.get(b)) { 
     return 1; 
    } else { 
     int stringCompare = a.compareToIgnoreCase(b); 
     return stringCompare == 0 ? 1 : stringCompare; // returning 0 would merge keys 
    } 
} 
+0

OK, działa już teraz! – Katie

+0

@Katie Przepraszam, że była w porządku rosnącym - zmieniona. – assylias

+0

OK, relaks :) Rozwiązane, dziękuję bardzo za pomoc! – Katie

3

jako naturalny porządek nie ma nic wspólnego z sortowni życzeń

List<Map.Entry<String, Integer>> entries = new ArrayList<>(m.entrieSet()); 

Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
    @Override 
    public int compare(Map.Entry<String, Integer >a, Map.Entry<String, Integer>b) { 
     if (a.getValue() < b.getValue()) { // Descending values 
      return 1; 
     } else if (a.getValue() > b.getValue()) { 
      return -1; 
     } 
     return -a.getKey().compareTo(b.getKey()); // Descending keys 
    }  
}); 
+0

+1. Zdumiewająco zły jest pomysł napisania komparatora o wartości takiej, jak robi to OP, i skazanie kodu na mylące, zaskakujące i niemożliwe do debugowania wiadomości. –