PriorityQueue类

2023-12-05

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() 方法,你可以修改比较器的排序顺序,使较短的字符串排在前面,从而改变优先级的顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PriorityQueue类 的相关文章

随机推荐

  • 允许root远程连接数据库

    开放root远程连接数据库的权限 Linux系统 环境 centos7 关闭防火墙 没关要开放数据库的端口 一 进入数据库 查看权限表信息 MariaDB none gt use mysql Reading table informatio
  • 为什么最近听说 Go 岗位很少很难?

    大家好 我是煎鱼 其实这个话题已经躺在我的 TODO 里很久了 近来很多社区的小伙伴都私下来交流 也有在朋友圈看到朋友吐槽 Go 上海的大会没什么人 还不如 Rust 大会 比较尴尬 今天主要是看看为什么 Go 岗位看起来近来很难的样子 也
  • 计算机组成与设计:硬件/软件接口,第三章详细梳理,附思维导图

    文章目录 三 计算机的运算 章节导图 一 整数的表示 无符号整数 原码 反码 原码是带符号整数的表示方法
  • Liunx常用基础命令

    目录 liunx常用命令基础 1 cd命令 2 ls命令 3 pwd命令 4 touch命令 5 head命令 6 cat命令 7 more命令
  • 网络安全日报 2023年12月04日

    1 研究人员披露Lazarus组织已窃取价值30亿美元加密货币 https go recordedfuture com hubfs reports cta 2023 1130 pdf 至少自2017年以来 来自朝鲜的Lazarus组织越来越
  • Linux(13):例行性工作排程

    例行性工程 听谓的排程是将工作安排执行的流程之意 Linux 排程就是透过 crontab 与 at 这两个东西 两种工作排程的方式 一种是例行性的 就是每隔一定的周期要来办的事项 一种是突发性的 就是这次做完以后就没有的那一种 at at
  • 软件测试/人工智能|Python 变量解析:从基础概念到内存地址探究

    变量 什么是变量 变量是在程序中用于存储数据的名称 它们可以存储各种类型的数据 比如数字 文本 列表 字典等等 变量类型 在介绍变量时 可以提及 Python 中常见的变量类型 例如整数 浮点数 字符串 布尔值 列表 元组 字典等 如下所示
  • 分享一个字节面试题:如何实现准时的setTimeout

    最近有同学在面试的时候被问到了这个问题 所以我们利用这篇文章对这个问题进行下解答 背景 setTimeout 是 不准 的 因为 setTimeout 是一个宏任务 它的指定时间指的是 进入主线程的时间 setTimeout callbac
  • span标签点击去掉光标

    很简单 一行样式搞定 caret color transparent
  • 对象转成json后转成byte[]后在转成string会提示序列化失败,第一个字符是问号

    问题复现 一个对象需要转成json 后转成byte 后经过网络传输 后再次反序列化为对象 但是最后反序列的时候会报错 打印json发现开头是一个问号 省流 使用这个进行反序列化
  • 【JavaScript】2.1 高级语法特性

    在JavaScript的基础部分 我们已经学习了变量 数据类型 操作符 流程控制 函数 事件和DOM操作等基础知识 接下来 我们将学习一些JavaScript的高级语法特性 包括闭包 原型和原型链 作用域和作用域链 异步编程和Promise
  • 网站防盗链是什么

    随着互联网的快速发展 网站的安全问题越来越受到关注 其中 防盗链是许多网站面临的一个重要问题 本文将介绍网站防盗链的基本概念 原因以及如何采取措施进行保护 一 什么是网站防盗链 网站防盗链是指未经授权的网站通过技术手段获取并使用其他网站的资
  • 微信扫码登录修改二维码的样式

    默认是这个样子二维码都没有展示全 微信的了的 js 对象是这个样子 既然大家看到我这篇文章 想必里面的属性已经知道了 这里不做赘述 let href data text css base64 LmltcG93ZXJCb3ggLnFyY29k
  • python+requests接口自动化测试框架实例详解教程

    前段时间由于公司测试方向的转型 由原来的web页面功能测试转变成接口测试 之前大多都是手工进行 利用postman和jmeter进行的接口测试 后来 组内有人讲原先web自动化的测试框架移驾成接口的自动化框架 使用的是java语言 但对于一
  • MN316 OpenCPU丨Flash使用介绍

    在MN316 标准版SDK中 定义了操作模组内置flash接口 用户可操作空间为64KB 分为16个block 每个block大小为4KB 用户如有操作flash的需求 可调用相关接口 FOTA使用流程解析 以下流程图为使用 MN316 O
  • 聊聊刻意练习-构建心理表征

    这是鼎叔的第八十一篇原创文章 行业大牛和刚毕业的小白 都可以进来聊聊 欢迎关注本专栏和微信公众号 敏捷测试转型 星标收藏 大量原创思考文章陆续推出 本人新书 无测试组织 测试团队的敏捷转型 已出版 机械工业出版社 各大电商平台热销中 30万
  • enable_shared_from_this使用介绍

    文章目录 enable shared from this定义 使用场合 源码实现 注意 enable shared from this定义 定义于头文件 template lt class T gt class enable shared
  • HarmonyOS 振动效果开发指导

    Vibrator 开发概述 振动器模块服务最大化开放硬工最新马达器件能力 通过拓展原生马达服务实现振动与交互融合设计 打造细腻精致的一体化振动体验和差异化体验 提升用户交互效率和易用性 提升用户体验 增强品牌竞争力 运作机制 Vibrato
  • nginx服务无法启动。报错:[emerg] 8482#8482: still could not bind()

    安装nginx后发现nginx启动不起来 查看日志报错情况 tail 1000f var log nginx error log 2023 12 04 16 29 50 notice 8482 8482 try again to bind
  • PriorityQueue类

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