PriorityQueue是Java内置的优先队列,每次取出来的元素是最小的。PriorityQueue可以做到自动扩容。PriorityQueue中的对象必须是可比较的。
例如,最简单的情况,在PriorityQueue中保存整数:
PriorityQueue<Integer> priInt = new PriorityQueue<>();
然后在其中依次添加五个整数(注意,在PriorityQueue中添加对象,可以调用add,也可以调用offer。)
priInt.add(1);
priInt.add(3);
priInt.add(4);
priInt.add(5);
priInt.add(2);
然后通过poll函数所取出来的值就是从小到大排列好的1,2,3,4,5
int n = priInt.poll(); // n is 1
n = priInt.poll(); // n is 2
n = priInt.poll(); // n is 3
n = priInt.poll(); // n is 4
n = priInt.poll(); // n is 5
PriorityQueue中还可以放置自定义对象。由于PriorityQueue中的对象必须是可比较的,所以必须为自定义对象定义比较规则。
例如,对于自定义类
class MyClass {
int n1;
int n2;
public MyClass(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
}
具体做法有3种
1、MyClass实现接口Comparable,在override的函数compareTo中定义比较规则
static class MyClass implements Comparable<MyClass> {
int n1;
int n2;
public MyClass(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
@Override
public int compareTo(MyClass o) {
return this.n2 - o.n2;
}
}
然后,PriorityQueue上就不用做任何额外的操作了,直接定义即可
PriorityQueue<MyClass> priMyClass = new PriorityQueue<>();
2、在PriorityQueue的参数中,通过Comparator接口定义比较规则
PriorityQueue<MyClass> priMyClass = new PriorityQueue<>(
new Comparator<MyClass>() {
public int compare(MyClass o1, MyClass o2) {
return o1.n2 - o2.n2;
}
}
);
3、在PriorityQueue的参数中,通过lambda表达式定义比较规则。写起来最省事
PriorityQueue<MyClass> priMyClass = new PriorityQueue<>((MyClass o1, MyClass o2) -> o1.n2 - o2.n2);