6

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

我想按降序对该地图进行排序;即出现频率最高的字母在第一行,输出的最后一行表示出现频率最低的字母。如果两个字母的频率相同,那么字母表中排在第一位的字母必须首先出现。怎么做?

我试过比较器:

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 回答