📜  Java中的优先队列(1)

📅  最后修改于: 2023-12-03 15:16:30.976000             🧑  作者: Mango

Java中的优先队列

什么是优先队列

优先队列是一种特殊的队列,它的元素具有优先级,每次出队的是具有最高优先级的元素。如果优先级相同时,按照先进先出的顺序。

Java中的优先队列

在Java的util包中,提供了一个优先队列类 PriorityQueue,可以通过它来实现优先队列的功能。

代码示例
import java.util.PriorityQueue;

public class PriorityQueueExample {

    public static void main(String[] args) {
        // 创建一个优先队列
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();

        // 添加元素
        priorityQueue.add(3);
        priorityQueue.add(1);
        priorityQueue.add(5);
        priorityQueue.add(4);
        priorityQueue.add(2);

        // 输出队列,注意观察元素的顺序
        System.out.println(priorityQueue);

        // 出队并输出元素
        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
    }
}

输出结果:

[1, 2, 5, 4, 3]
1
2
3
4
5
使用指南
  1. 创建一个优先队列对象,可以不指定容量大小,它会自动扩容。
  2. 通过add()方法向队列中添加元素,此时会自动按照元素的自然顺序进行排序。
  3. 通过poll()方法可以将队列中的一个元素移除并返回,注意,这里取出的是最高优先级的元素。
  4. 通过peek()方法可以查看队列头部的元素,但不会移除该元素。
自定义排序规则

我们也可以通过自定义比较器来实现按照指定的规则排序。比如按照元素的值大小倒序排列,代码示例如下:

import java.util.Comparator;
import java.util.PriorityQueue;

public class ComparatorExample {

    public static void main(String[] args) {
        // 创建一个自定义的比较器来实现倒序排列
        Comparator<Integer> comparator = new Comparator<Integer>() {
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        };

        // 创建一个优先队列,并使用自定义的比较器
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>(comparator);

        // 添加元素
        priorityQueue.add(3);
        priorityQueue.add(1);
        priorityQueue.add(5);
        priorityQueue.add(4);
        priorityQueue.add(2);

        // 输出队列,注意观察元素的顺序
        System.out.println(priorityQueue);

        // 出队并输出元素
        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
    }
}

输出结果:

[5, 4, 3, 1, 2]
5
4
3
2
1
总结

优先队列是一种具有优先级的队列, Java中的 PriorityQueue 类能够实现优先队列的常用操作,如添加元素及出队。在使用时,可以使用默认的比较器自然排序,也可以自定义比较器按照自己的规则来排序。