将优先级队列更改为最大优先级队列

2022-08-31 06:57:06

我在整数的Java中有优先级队列:

 PriorityQueue<Integer> pq= new PriorityQueue<Integer>();

当我调用时,我得到最小元素。pq.poll()

问:如何更改代码以获得最大元素?


答案 1

怎么样像这样:

PriorityQueue<Integer> queue = new PriorityQueue<>(10, Collections.reverseOrder());
queue.offer(1);
queue.offer(2);
queue.offer(3);
//...

Integer val = null;
while( (val = queue.poll()) != null) {
    System.out.println(val);
}

提供了 一个,在这种情况下,它将按 oposite 顺序对 中的元素进行排序,使其自然顺序。Collections.reverseOrder()ComparatorPriorityQueue


答案 2

从 Java 8 开始,您可以使用 lambda 表达式。

以下代码将打印 10,越大。

// There is overflow problem when using simple lambda as comparator, as pointed out by Фима Гирин.
// PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);

PriorityQueue<Integer> pq =new PriorityQueue<>((x, y) -> Integer.compare(y, x));

pq.add(10);
pq.add(5);
System.out.println(pq.peek());

lambda 函数将两个 Integer 作为输入参数,相互相减,然后返回算术结果。lambda 函数实现功能接口 。(这是就地使用的,而不是匿名类或离散实现。Comparator<T>