关于java:如何整理TreeMap< String,Integer>?

How to sort out a TreeMap<String, Integer>?

我有一张地图:TreeMap m = new TreeMap<>();,其中有一个完整的字母表和值,显示了在我的文本中每个字母被发现的次数。

我想按递减计数顺序对该映射进行排序;也就是说,最频繁的字母在第一行,最后一行输出表示最不频繁的字母。如果两个字母的频率相同,那么字母表中第一个字母必须出现在第一位。怎么做到的?

我试过比较器:

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

但是,不是这样,产出是:

1
2
3
4
D 3
E 3
A 2
S 5

伙计们。。。以前发现的,根本没用。好的输出应该是:

1
2
3
4
S 5
D 3
E 3
A 2


由于自然排序与您的排序愿望没有任何共同之处:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
    }    
});


你的比较器看起来不对劲-这应该会更好:

1
2
3
4
5
6
7
8
9
10
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
    }
}