我在整数Java有优先级队列:
PriorityQueue<Integer> pq= new PriorityQueue<Integer>();
当我调用pq.投票()
时,我得到了最小的元素。
问题:如何更改代码以获取最大元素?
这样怎么样:
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));