6

私は地図を持っています:TreeMap<String, Integer> m = new TreeMap<>();アルファベットと値全体があり、テキストで各文字が何回見つかったかを示しています。

そのマップをカウントの降順で並べ替えたいと思います。つまり、最も頻度の高い文字は最初の行にあり、出力の最後の行は最も頻度の低い文字を示します。2つの文字の頻度が同じである場合、アルファベットの最初に来る文字が最初に表示される必要があります。どうやって作るの?

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

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

しかし、それでも、それではなく、出力は次のとおりです。

D 3
E 3
A 2
S 5

みんな...以前にこれを見つけました、これはまったく役に立ちませんでした。良好な出力は次のようになります。

S 5
D 3
E 3
A 2
4

2 に答える 2

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
    }
}
于 2013-02-01T13:37:23.180 に答える
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
    }    
});
于 2013-02-01T13:41:12.610 に答える