Java数据结构-优先级队列

Java中的优先级队列(Priority Queue)是Java集合框架的一部分,它实现了Queue接口,并允许存储的元素具有一定的优先级。优先级队列是自然排序的,或者根据创建优先级队列时提供的Comparator进行排序。这意味着队列的头部是优先级最高的元素。如果多个元素具有相同的优先级,则它们按照它们在队列中的顺序排序。

在Java中,优先级队列通常通过PriorityQueue类实现。以下是一个简单的示例:

java 复制代码
import java.util.PriorityQueue;

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

        // 添加元素到优先级队列
        pq.add(3);
        pq.add(1);
        pq.add(4);
        pq.add(1);
        pq.add(5);
        pq.add(9);
        pq.add(2);
        pq.add(6);

        // 打印优先级队列的元素
        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }
    }
}

在上面的示例中,我们创建了一个PriorityQueue对象,并添加了一些整数。由于PriorityQueue默认使用自然排序(对于整数,就是从小到大的顺序),因此当我们打印队列的元素时,它们将按照从小到大的顺序打印。

你也可以通过提供一个自定义的Comparator来改变排序规则。例如,如果你想要一个优先级队列,其中元素按照从大到小的顺序排列,你可以这样做:

java 复制代码
import java.util.Comparator;
import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个优先级队列,并使用自定义的Comparator
        PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1; // 降序排列
            }
        });

        // 添加元素到优先级队列
        pq.add(3);
        pq.add(1);
        pq.add(4);
        pq.add(1);
        pq.add(5);
        pq.add(9);
        pq.add(2);
        pq.add(6);

        // 打印优先级队列的元素
        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }
    }
}

在这个例子中,我们创建了一个PriorityQueue对象,并提供了一个自定义的Comparator。这个Comparator将元素按照从大到小的顺序排列。因此,当我们打印队列的元素时,它们将按照从大到小的顺序打印。

相关推荐
Merlos_wind6 分钟前
HashMap详解
算法·哈希算法·散列表
虹科网络安全9 分钟前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje34 分钟前
Java语法进阶
java·开发语言·jvm
汉克老师37 分钟前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
rKWP8gKv71 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫1 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287921 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本1 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211231 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
Yzzz-F3 小时前
Problem - 2205D - Codeforces
算法