我有一张地图: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
答案 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
}
});