private Map<Character, Integer> frequencies;
我有一个Map
withCharacter
是 Key 和它相关Integer
的 Value。
按价值排序的最佳/最快/有效方式是什么?
即地图可能有
a,1
c,10
p,5
s,7
排序后,它将是
a,1
p,5
s,7
c,10
我正在考虑使用优先队列和整数来做,但如果整数 val 是重复的,我会丢失 Character 值
优先级队列是一种不错的方法 - 您需要做的就是从地图中获取Entry
集合,并覆盖 aComparator
作为队列的输入。
Map<Character,Integer> map = new HashMap<Character, Integer>();
map.put('a',1);
map.put('c',10);
map.put('p',5);
map.put('2',7);
PriorityQueue<Entry<Character, Integer>> pq = new PriorityQueue<Map.Entry<Character,Integer>>(map.size(), new Comparator<Entry<Character, Integer>>() {
@Override
public int compare(Entry<Character, Integer> arg0,
Entry<Character, Integer> arg1) {
return arg0.getValue().compareTo(arg1.getValue());
}
});
pq.addAll(map.entrySet());
while (!pq.isEmpty()) {
System.out.println(pq.poll());
}
将产生(如预期):
a=1
p=5
2=7
c=10
注意:避免使用带键的 aSet
或 aMap
作为映射的值 - 因为它不能很好地处理重复值。
使用谷歌番石榴。它包含可以反转的 BiMap 实现,然后只对反转的映射键进行排序。
Map<Character, Integer> myMap = HashBiMap.create();
// put your values in myMap
Map<Integer, Character> inversed = myMap.inverse();
SortedMap<Integer, Character> sortedInversed = new TreeMap<Integer, Character>(inversed);
所以只需迭代 sortedInversed