📅  最后修改于: 2023-12-03 15:22:05.457000             🧑  作者: Mango
优先队列是一种数据结构,按照指定的优先级进行排序,每次弹出优先级最高的元素。在Java中,可以使用Java集合框架中的PriorityQueue实现优先队列。
优先队列的一个重要应用是任务调度。比如某个操作系统中有多个任务需要执行,每个任务都有一个执行时间,怎样才能最快地执行完所有任务呢?我们可以使用优先队列,按照任务执行时间的先后顺序进行调度。
在一些算法中,我们需要按照某种顺序遍历图或者树,可以用优先队列来实现。另外,优先队列也可以用于某些贪心算法或者最小生成树算法的实现。
Java集合框架中的PriorityQueue默认是按照元素的自然顺序来排序的。比如,如果要生成一个整数类型的优先队列,可以这样写:
PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
然后对queue中插入元素,每次取出的时候都是最小的元素:
queue.add(4);
queue.add(1);
queue.add(3);
queue.add(2);
while (!queue.isEmpty()){
System.out.print(queue.remove()+" ");
}
//输出:1 2 3 4
PriorityQueue支持任何类型的元素,只要元素实现了Comparable接口或者我们自己提供了比较器(Comparator)。
现在我们的需求变了,需要按照元素的相反顺序来排序,也就是要把最大的元素放在队首。怎样实现呢?
我们可以通过自定义一个PriorityQueue类的子类,并重写其compare方法来实现。
class ReversePriorityQueue<E extends Comparable<E>> extends PriorityQueue<E>{
public ReversePriorityQueue(){
super();
}
public ReversePriorityQueue(int initialCapacity){
super(initialCapacity);
}
public ReversePriorityQueue(int initialCapacity, Comparator<? super E> comparator){
super(initialCapacity, Collections.reverseOrder(comparator));
}
public ReversePriorityQueue(Comparator<? super E> comparator){
super(Collections.reverseOrder(comparator));
}
@Override
public boolean add(E e) {
return super.add(e);
}
@Override
public boolean offer(E e) {
return super.offer(e);
}
@Override
public E peek() {
return super.peek();
}
@Override
public E poll() {
return super.poll();
}
}
我们也可以在构造PriorityQueue的时候,提供一个Comparator来实现相反顺序的排序。首先,需要自定义一个Comparator,然后使用Collections.reverseOrder方法来反转该比较器:
Comparator<Integer> cmp = Collections.reverseOrder();
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(cmp);
通过继承PriorityQueue或者提供Comparator对象,我们可以实现任意顺序的优先队列,轻松应对各种需求。