使用值对Map进行排序的最佳方法

时间:2012-12-02 22:58:16

标签: java sorting map

private Map<Character, Integer> frequencies;

我有一个Map,其中Character为关键字,其关联的Integer为值。

按价值排序的最佳/最快/效率方式是什么?

即地图可能有 一,1个
C,10
P,5
S,7
经过分类后, 这将是 一,1个
P,5
S,7
C,10

我正在考虑使用优先级队列和整数进行,但如果整数值是重复的话,我会丢失字符值

2 个答案:

答案 0 :(得分:2)

优先级队列是一种不错的方法 - 您需要做的只是来自地图的get the Entry set,并覆盖Comparator作为队列的输入。

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

注意:避免使用带有键的SetMap作为地图的值 - 因为它不会很好地处理重复值。

答案 1 :(得分:1)

使用Google Guava。它包含可以反转的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