如何整理TreeMap <string,integer =“”>?</string,>

时间:2013-02-01 13:12:09

标签: java treemap

我有一张地图:TreeMap<String, Integer> m = new TreeMap<>();我有一个完整的字母和值,显示我的文字中每个字母的次数。

我想按递减计数顺序对该地图进行排序;也就是说,最常见的字母在第一行,最后一行表示最不频繁的字母。 如果两个字母的频率相同,那么字母表中首字母必须首先出现。如何制作?

我试过Comparator:

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

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分: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
    }    
});