无法理解优先队列流程

时间:2018-10-22 18:35:11

标签: java algorithm hashmap priority-queue

        String S = "aaaaaaaacabbbb";

        if (S == null || S.length() == 0) {
            return;
        }
        Map<Character, Integer> map = new HashMap<>();
        for (char c : S.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue<>((a, b) -> (b.getValue() - a.getValue()));
        pq.addAll(map.entrySet());
        System.out.println(pq);

因此,我了解到对于此特定代码段,具有最高值的键具有最高的优先级,当我打印队列时,我得到了

[a=9, b=4, c=1]

但是当我使用这个比较器

PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue<>((a, b) -> (a.getValue() - b.getValue()));

我不明白为什么会这样

[c=1, a=9, b=4]

我认为b将排在第二,a将排在最后

第二个问题

此外,当我添加条目

  Map.Entry<Character, Integer> entry =
 new java.util.AbstractMap.SimpleEntry<Character, Integer>('a', 5);
            pq.offer(entry);

我得到这个输出

[c=1, a=5, b=4, a=9]

不了解a的行踪如何

1 个答案:

答案 0 :(得分:3)

引用PriorityQueue的javadoc:

  

方法iterator()中提供的Iterator不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用Arrays.sort(pq.toArray())