2013-02-01 16 views
6

Ho una mappa: TreeMap<String, Integer> m = new TreeMap<>(); dove ho un intero alfabeto e valori, che mostra quante volte ogni lettera è stata trovata nel mio testo.Come ordinare una TreeMap <String, Integer>?

Desidero ordinare la mappa in ordine decrescente; cioè, la lettera più frequente è sulla prima riga e l'ultima riga di output indica la lettera meno frequente. Se due lettere hanno la stessa frequenza, la prima lettera dell'alfabeto deve apparire per prima. Come si fa?

ho provato con Comparatore:

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

ma ancora, la sua non è vero, l'output è:

D 3 
E 3 
A 2 
S 5 

Ragazzi ... Abbiamo trovato questo prima, questo aiuto non ha ancora del tutto. Buona uscita dovrebbe essere:

S 5 
D 3 
E 3 
A 2 
+0

duplicato esatto http://stackoverflow.com/questions/3074154/sorting-a-hashmap-based-on-value-then-key – JohnJohnGa

+0

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

+0

@JohnJohnGa: no. La mia domanda è un po 'diversa. Vedi la mia modifica – Katie

risposta

3

Il tuo comparatore non guardare a destra - questo dovrebbe funzionare meglio:

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, funziona ora! – Katie

+0

@Katie Siamo spiacenti in ordine crescente - modificato. – assylias

+0

Ok, rilassati :) Risolto, grazie mille per l'aiuto! – Katie

3

Come il tipo naturale ha nulla in comune con il vostro desiderio di ordinamento:

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. È una bruttissima idea provare a scrivere un comparatore di valore come sta facendo l'OP, e condannerà il tuo codice a confusione, a sorpresa e a problemi di impossibilità di debug. –

Problemi correlati