2013-02-01 9 views
6

私はマップを持っています:TreeMap<String, Integer> m = new TreeMap<>();ここで私はアルファベットと値を持っています。これは、各文字がテキスト内で何回見つかったかを示しています。TreeMapを並べ替える方法<String、Integer>?

降順でソートする必要があります。つまり、最も頻繁な文字が最初の行にあり、出力の最後の行が最も頻度の低い文字を示しています。 2つの文字が同じ頻度である場合、アルファベットの最初に来る文字が最初に表示される必要があります。作成方法

私はコンパレータで試してみました:

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

が、それでも、そのことは、出力は次のようになります、前にすべてのこのdidntの助けがこれを見つけた

D 3 
E 3 
A 2 
S 5 

ガイズ...。グッド出力は次のようになります。

S 5 
D 3 
E 3 
A 2 
+0

正確な複製http://stackoverflow.com/questions/3074154/sorting-a-hashmap-based-on-value-then-key – JohnJohnGa

+0

別の複製http://stackoverflow.com/questions/1448369/how-to-sort- a-treemap-on-its-values – mellamokb

+0

@JohnJohnGa:no。私の質問は少し違う。私の編集を参照してください – Katie

答えて

3

あなたのコンパレータは、右を見ていない - これは、より良い動作するはずです:自然の一種として

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

今すぐお仕事! – Katie

+0

@Katie申し訳ありませんが、昇順になっています。 – assylias

+0

Ok、relax :)解決してくれてありがとう、助けてくれてありがとう! – Katie

3

をあなたのソート願いと共通のものを持っていない:

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。 OPがやっているようにコンパイラを値でコンパイルしようとするのは驚くほど悪い考えです。あなたのコードを混乱させ、驚くほど、そして不可能なデバッグ・ミスに惑わすでしょう。 –

関連する問題