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将元素按照从大到小的顺序排列。因此,当我们打印队列的元素时,它们将按照从大到小的顺序打印。

相关推荐
wfeqhfxz25887822 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
毕设源码-朱学姐3 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
Aaron15883 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
Queenie_Charlie3 小时前
前缀和的前缀和
数据结构·c++·树状数组
C雨后彩虹4 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
_不会dp不改名_4 小时前
leetcode_3010 将数组分成最小总代价的子数组 I
算法·leetcode·职场和发展
java1234_小锋5 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
2501_944525545 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐5 小时前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法