赞
踩
今天稍稍了解了一下Java中的优先队列PriorityQueue,做了以下总结。
要了解PriorityQueue,首先我们应该了解其中比较常用的方法,如下。
(导图非本人所画)
首先是他的排序规则,优先队列默认是小根堆,即升序排序,我们可以通过如下代码验证。
代码示例:
public static void main(String[] args) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.add(5);
queue.add(4);
queue.add(3);
queue.add(2);
queue.add(1);
while(!queue.isEmpty()){
System.out.println(queue.poll());
}
}
结果输出:
PS:由上图结果可知,PriorityQueue给我们提供了一个默认的排序方法,为n1-n2,这是一种普遍的比较方法,但是如果我们想改变队列的排序,把它改成大根堆(降序排序),我们可以通过在构造队列时new一个新的比较器实现。
改为大根堆代码:
public static void main(String[] args) { //new 一个比较器 PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer n1, Integer n2) { //默认n1-n2,我们将它改为n2-n1 return n2-n1; } }); //new 一个比较器 //匿名函数+lambda表达式 //PriorityQueue<Integer> queue = new PriorityQueue<>((n1, n2) -> n2 - n1); queue.add(4); queue.add(3); queue.add(2); queue.add(5); queue.add(1); while(!queue.isEmpty()){ System.out.println(queue.poll()); } }
结果输出:
如果我们要往队列中插入数组,类对象等引用数据类型时,我们则需要自己重写一个比较器方法,因为系统不知道我们需要怎么排序,也没有对应的方法来给我们排序,所以我们要自己写一个。
代码示例:
public static void main(String[] args) {
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] arr1, int[] arr2) {
return arr1[0]-arr2[0];
}
});
queue.add(new int[]{2,1});
queue.add(new int[]{3,4});
queue.add(new int[]{1,5});
while(!queue.isEmpty()){
int[] poll = queue.poll();
System.out.println(poll[0]+" : "+poll[1]);
}
}
如上所示,插入数组,我们以数组的第一个元素为比较内容,才可以正常输出,若不重写,则无法运行代码。
结果输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。