2013-02-01 18 views
6

Bir haritam var: TreeMap<String, Integer> m = new TreeMap<>(); Burada tam bir alfabeye ve değerlere sahibim. Bu, metnimde her harfin kaç defa bulunduğunu gösterir.Bir TreeMap nasıl ayrılır <String, Tamsayı>?

Bu haritayı azalan sayım sırasına göre sıralamak istiyorum; Yani, en sık görülen harf ilk satırdadır ve son çıktı satırı en az sık kullanılan harfi gösterir. İki harf aynı frekansa sahipse, önce alfabede ilk gelen harf önce görünmelidir. Nasıl yapmalı?

Ben karşılaştırıcı ile çalıştı:

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

ama yine de onun değil mi, çıkış geçerli:

D 3 
E 3 
A 2 
S 5 

Çocuklar ... hiç daha önce bu daha hiç Yardım buldum. İyi çıkış olmalıdır:

S 5 
D 3 
E 3 
A 2 
+0

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

+0

başka bir kopya http://stackoverflow.com/questions/1448369/how-to-sort- a-treemap-based-on-kendi değerleri – mellamokb

+0

@JohnJohnGa: hayır. Benim sorum biraz farklı. Benim çalışmamı gör – Katie

cevap

3

Kişisel karşılaştırıcı doğru görünmüyor - bu daha iyi çalışması gerekir:

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

Tamam, şimdi çalışıyor! – Katie

+0

@Katie Üzgünüz, artan düzende - değiştirildi. – assylias

+0

Tamam, rahatla :) Çözüldü, yardım için çok teşekkürler! – Katie

3

doğal tür hiçbir ortak yanı yoktur gibi sizin sıralama dilek ile:

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. Bir karşılaştırıcıyı OP'in yaptığı gibi bir değere göre yazmayı denemek ve kodunuzu kafa karıştırıcı, şaşırtıcı ve imkansız hale getirme karmaşalarına mahkum etmek şaşırtıcı derecede kötü bir fikirdir. –