PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。
该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。
下面是使用PriorityQueue构建一个top N的例子:
//实体类
package com.hello.queueTest;
import lombok.Data;
@Data
public class Goods {
private String id;
private String name;
private Integer clickNum;
public Goods() {
}
public Goods(String id, String name, Integer clickNum) {
this.id = id;
this.name = name;
this.clickNum = clickNum;
}
}
//测试类
package com.hello.queueTest;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
//优先级队列ProperQueue测试类
/* 常用方法注解:
add(E e):插入元素 add(E e),实际上方法内部调用return offer(E e);
offer(E e):插入元素
peek():检索但不删除此队列的头
poll():检索且删除队列的头
*/
public class PriorityQueueTest {
public static void main(String[] args) {
//定义队列并内部类实现比较接口
PriorityQueue<Goods> pq=new PriorityQueue<>((o1, o2) -> {
if(o2.getClickNum().equals(o1.getClickNum())){ //点击次数一样比较id,id小的排在前面
return o1.getId().compareTo(o2.getId());
}
return o2.getClickNum()-o1.getClickNum();
});
Goods g1=new Goods("1","11",1);
Goods g2=new Goods("2","22",2);
Goods g3=new Goods("3","33",4);
Goods g4=new Goods("4","44",4);
Goods g5=new Goods("5","55",5);
pq.add(g3);
pq.add(g5);
pq.add(g1);
pq.add(g4);
pq.add(g2);
//进栈后改变队列中的对象并不会重新排序,只能先删除改变值后再添加
/* pq.remove(g3);
g3.setClickNum(3);
pq.add(g3);*/
//poll出栈才会按排序输出,出栈后元素是全部清空的
while (pq.size()>0){
System.out.println(pq.poll());
}
System.out.println("------------------------------------------");
/* pq.forEach(g->{
//循环是么有顺序的
System.out.println(g.toString()); });*/
//构建topN,只能按升序输出,因为要在队列的前面poll()出来。
int maxNum=3;
PriorityQueue<Goods> p=new PriorityQueue<>(maxNum, (o1, o2) -> {
if(o1.getClickNum().equals(o2.getClickNum())){
return o1.getId().compareTo(o2.getId());
}
return o1.getClickNum()-o2.getClickNum();
});
List<Goods> list=new ArrayList<>();
list.add(g3); list.add(g5);
list.add(g1); list.add(g4);
list.add(g2);
list.forEach(good->{
if(p.size()<maxNum){
p.add(good);
}else{
if(p.peek().getClickNum()<good.getClickNum()){
p.poll();
p.add(good);
}
}
});
while (p.size()>0){
System.out.println(p.poll());
}
}
}