PriorityQueue是java中数据结构Queue的实现子类,按照源码中标注的原意:PriorityQueue是一个有着默认容量大小(DEFAULT_INITIAL_CAPACITY = 11)并且内部元素是按照指定的比较器方式所排列的。
一般构造方法
//无参构造,默认容量为11
public PriorityQueue() {
this(DEFAULT_INITIAL_CAPACITY, null);
}
//指定容量大小构造队列
public PriorityQueue(int initialCapacity) {
this(initialCapacity, null);
}
//指定队列所使用的比较规则,传入一个自定义的比较器
public PriorityQueue(Comparator<? super E> comparator) {
this(DEFAULT_INITIAL_CAPACITY, comparator);
}
//其他构造器默认调用的最核心的构造方法,传入容量大小和自定义的比较器
public PriorityQueue(int initialCapacity,
Comparator<? super E> comparator) {
// Note: This restriction of at least one is not actually needed,
// but continues for 1.5 compatibility
if (initialCapacity < 1)
throw new IllegalArgumentException();
this.queue = new Object[initialCapacity];
this.comparator = comparator;
}
常用方法
①boolean add(E o):将指定的元素插入优先队列中
②void clear():清理队列元素
③boolean contains(object o):查看是否元素包含在队列中
④boolean offer(E o):将指定的元素插入优先队列中
⑤E peek():返回队列头部元素
⑥E poll():弹出队列头部元素
⑦boolean remove(object o):删除某个元素(如果存在的话)
温馨提示***:应该会有人好奇add和offer方法的区别,看了介绍没看出哪里不一样对吧。其实我也没看出。所以去看了下源码,如下:
public boolean add(E e) { return offer(e); }
这里大家应该就知道了,其实add方法底层调用的就是offer方法,也就是说,这俩方法一样。。。。。没什么区别
使用优先队列实现topN
下面会使用lambda表达式快速实现自定义比较器。
lambda表达式是在jdk 1.8之后出现,适用场景:如果一个接口或者类中只有一个待实现的抽象方法,那么就可以使用lambda表达式进行实现该方法。
/**
* 首先初始化一个PriorityQueue队列,这里我们使用第三种构造方法
* topN可能是取最大的前几位,也可能是取最小的前几位。有限队列默认是升序,
* 这里我自定义排序为降序,取最大的前几个数
* 升序:new PriorityQueue<Integer>((x,y)->x-y);
* 降序:new PriorityQueue<Integer>((x,y)->y-x);
* 这里为了方便使用lambda表达式,去实现了compareTo方法
*/
PriorityQueue queue = new PriorityQueue<Integer>((x,y)->x-y);
//给定散乱的元素
int[] arr = new int[]{1,5,3,4,6,9,2,7,8};
//入队列
for(int i:arr){
//这个时候已经自动在排序了
queue.add(i);
}
//输出结果 假如输出前k位
for(int j=0;j<k;j++){
System.out.println(queue.poll());
}