当前位置: 首页 > article >正文

PriorityQueue类

PriorityQueue类

Java中的PriorityQueue是一个基于优先级堆的无界优先级队列。它是一个队列,可以按照元素的优先级顺序对元素进行排序,并且允许快速访问具有最高优先级的元素。它实现了Queue接口,继承了AbstractQueue类。

主要函数和方法:

  1. 构造函数:

    PriorityQueue() // 创建一个初始容量为11的优先级队列,默认自然顺序排序
    PriorityQueue(int initialCapacity) // 创建具有指定初始容量的优先级队列,默认自然顺序排序
    PriorityQueue(Collection<? extends E> c) // 创建包含指定集合元素的优先级队列,默认自然顺序排序
    PriorityQueue(int initialCapacity, Comparator<? super E> comparator) // 创建具有指定初始容量和比较器的优先级队列
    
  2. 核心方法:

    • add(E e)offer(E e):将指定的元素插入队列。
    • peek():返回队列的头部(最高优先级元素),如果队列为空,则返回 null
    • poll():移除并返回队列的头部(最高优先级元素),如果队列为空,则返回 null
    • remove(Object o):从队列中移除指定的元素,如果存在的话。
    • clear():移除队列中的所有元素。
    • size():返回队列中的元素数量。
    • isEmpty():检查队列是否为空。
    • iterator():返回一个迭代器,可以按照元素的顺序遍历队列。

使用示例:

  1. 使用默认自然排序:

    PriorityQueue<Integer> pq = new PriorityQueue<>();
    pq.offer(5);
    pq.offer(2);
    pq.offer(8);
    pq.offer(1);
    
    // 遍历队列并按优先级顺序访问元素
    while (!pq.isEmpty()) {
        System.out.println(pq.poll());
    }
    
  2. 使用自定义比较器排序:

    // 自定义一个比较器,以字符串长度作为优先级排序
    Comparator<String> lengthComparator = Comparator.comparingInt(String::length);
    PriorityQueue<String> pq = new PriorityQueue<>(lengthComparator);
    
    pq.offer("apple");
    pq.offer("banana");
    pq.offer("orange");
    pq.offer("kiwi");
    
    // 遍历队列并按长度顺序访问元素
    while (!pq.isEmpty()) {
        System.out.println(pq.poll());
    }
    

PriorityQueue 可以用于实现任务调度、事件处理等场景,能够方便地处理具有优先级的元素集合。在使用过程中需要注意比较器的实现,确保元素能够按照预期的优先级排序。

Comparator.comparingInt(String::length) 创建了一个比较器,根据字符串的长度进行比较。这个比较器是按照长度来确定优先级的,所以较长的字符串会被认为是“更大”的(更高优先级),排在前面。

这是因为在标准的升序排序中,较大的元素(在这种情况下是指长度更长的字符串)会排在较小的元素前面。这符合通常的自然排序规则。所以,当你使用Comparator.comparingInt(String::length)创建的比较器时,它将会把字符串长度较长的排在前面。

如果你想要反转这种顺序,即短的字符串优先级高,你可以使用 reversed() 方法来反转比较器的顺序。例如:

Comparator<String> lengthComparator = Comparator.comparingInt(String::length).reversed();

通过调用 reversed() 方法,你可以修改比较器的排序顺序,使较短的字符串排在前面,从而改变优先级的顺序。


http://www.kler.cn/a/154909.html

相关文章:

  • github和Visual Studio
  • 轮转数组
  • 用友U8-Cloud uapbd.refdef.query sql注入漏洞复现
  • 爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)
  • 力扣662:二叉树的最大宽度
  • docker配置代理解决不能拉镜像问题
  • 大数据基础设施搭建 - 业务数据同步策略
  • Linux shell中的函数定义、传参和调用
  • c++的函数对象和适配器
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】单目视觉估计
  • 富文本编辑器(wangEditor 5)
  • Chat-GPT原理
  • 93基于matlab的萤火虫算法优化支持向量机(GSA-SVM)分类模型
  • Python中的split()、rsplit()、splitlines()的区别
  • opencv学习三:保存图片
  • 一起学docker系列之十四Dockerfile微服务实践
  • 《opencv实用探索·八》图像模糊之均值滤波简单理解
  • 【性能测试】稳定性/并发压力测试的TPS计算+5W并发场景设计...
  • FL Studio水果软件2024简体中文语言版本下载
  • elment Loading 加载组件动态变更 text 值bug记录
  • 【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结
  • DS二分查找_搜索二维矩阵
  • C++包装类
  • 山西电力市场日前价格预测【2023-12-04】
  • Mysql安全之基础合规配置
  • C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)