优先级队列上 HashMap 的自定义排序[重复]

问题描述 投票:0回答:1

我想获得按值排序的键值对,如果值相等,我想按键升序排序。

我尝试使用 PriorityQueue 如下,但由于某种原因我得到了空指针。请帮助我理解这个问题并可能回答我的疑问。

这是我想出的,但不幸的是代码的输出是

PQ:[你好,是的]

正如我所期待的那样

PQ:[不,你好]

public static void main(String[] args) {
     
        Map<String, Integer> map = new HashMap<>() {{
            put("Hello", 50);
            put("Yes", 50);
            put("No", 100);
        }};
        PriorityQueue<String> pq = new PriorityQueue<>((a, b) -> {
            if (map.get(a).equals(map.get(b))) return a.compareTo(b);
            else return Integer.compare(map.get(b), map.get(a));
        });
        verifyPQ(map, pq));
        System.out.println(pq);
}

   private static void verifyPQ(Map<String, Integer> map, PriorityQueue<String> pq) {
        for (String key : map.keySet()) {
            pq.add(key);
            if (pq.size() > 2) {
                pq.poll();
            }
        }
}
java hashmap priority-queue custom-sort
1个回答
0
投票

为什么不使用比较器而不是使用优先级队列使事情变得不必要的复杂化?

如果我理解正确的话,你想按值降序排序,按键升序排序。

Map<String, Integer> map = new HashMap<>();
map.put("Hello", 50);
map.put("Yes", 50);
map.put("No", 100);


map.entrySet()
   .stream()
   .sorted(Comparator.comparing(Entry<String,Integer>::getValue).reversed()
                     .thenComparing(Entry::getKey))
   .forEach(System.out::println);

如果您只需要前两项,只需添加限制即可

map.entrySet()
   .stream()
   .sorted(Comparator.comparing(Entry<String,Integer>::getValue).reversed()
                     .thenComparing(Entry::getKey))
   .limit(2)
   .forEach(System.out::println);
© www.soinside.com 2019 - 2024. All rights reserved.