java 使用自定义比较器初始化优先级队列,该比较器位于HashMap中

hwazgwia  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(143)

假设我有一个HashMap,其中值的类型为PriorityQueue,如下所示:

HashMap<Integer, PriorityQueue<Integer>> someMap = new HashMap<>();

但是,如果我需要PriorityQueue有一个定制的比较器,我如何初始化这个HashMap呢?
实际的比较器要复杂得多,但为了简单起见,我们假设我需要PriorityQueue按逆序排序,我可以这样做:

PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());

我应该在哪里以及如何为HashMap中的值定义比较器?

zxlwwiss

zxlwwiss1#

PriorityQueue内部使用的Comparator无论如何都不会改变它的类型。
一个使用自然排序的PriorityQueue<Integer>,或者Comparator.reverseOrder(),或者Comparator.nullsFirst(Comparator.reverseOrder())(或者任何其他比较器)仍然是PriorityQueue<Integer>,并且你可以将所有这些队列存储在一个类型为Map<Integer,PriorityQueue<Integer>>的Map中
在示例化Map时,您不需要做任何特殊的事情,只需像以前那样调用构造函数new HashMap<>()即可。

Map<Integer, Queue<Integer>> someMap = new HashMap<>();
        
Queue<Integer> pq1 = new PriorityQueue<>();
Queue<Integer> pq2 = new PriorityQueue<>(Comparator.reverseOrder());
Queue<Integer> pq3 = new PriorityQueue<>(Comparator.nullsFirst(Comparator.reverseOrder());
        
someMap.put(1, pq1);
someMap.put(2, pq1);
someMap.put(3, pq1);

  • <Integer,Queue<Integer>>这样的泛型类型参数是为了让编译器验证你使用的是正确的类型。这是一种编译类型机制,用于防止堆污染等问题,它与运行时内存分配无关。
  • 您可能有兴趣阅读What does it mean to "program to an interface"?,了解使用MapQueue等高级抽象的好处。
332nm8kg

332nm8kg2#

答案在问题本身中.你把比较器放在优先级队列示例中.

HashMap<Integer, PriorityQueue<Integer>> someMap = new HashMap<>();
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());
someMap.put(1,queue);

对于初始化和当你把数据放入你的队列时,你可以使用相同的队列来放入数据。

相关问题