提问者:小点点

将priorityQueue更改为max priorityQueue


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

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

当我调用pq.投票()时,我得到了最小的元素。

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


共3个答案

匿名用户

这样怎么样:

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);
}

在这种情况下,Collection. reusorder()提供了一个比较器,它将对PriorityQueue中的元素按照它们的自然顺序进行排序。

匿名用户

您可以使用lambda表达式,因为Java8。

以下代码将打印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函数将两个整数作为输入参数,相互减去,并返回算术结果。lambda函数实现了函数式接口,比较器

匿名用户

在Java8中,您可以通过以下方法之一创建最大优先级队列:

方法一:

PriorityQueue<Integer> maxPQ = new PriorityQueue<>(Collections.reverseOrder()); 

方法二:

PriorityQueue<Integer> maxPQ = new PriorityQueue<>((a,b) -> b - a); 

方法三:

PriorityQueue<Integer> maxPQ = new PriorityQueue<>((a,b) -> b.compareTo(a));