Java——PriorityQueue用法(实现最大堆)

Java——PriorityQueue用法

PriorityQueue 是 Java 中基于优先级堆实现的一个队列,可以用来存储一组元素,并按照一定的优先级顺序访问这些元素。其中,优先级高的元素会被先访问。

PriorityQueue 类位于 java.util 包中,是一个泛型类,可以存储任意类型的对象。

在 PriorityQueue 内部,元素会被排序,排序规则由元素的自然顺序或者指定的 Comparator 决定。

PriorityQueue 支持以下操作:

  • offer(E e):将指定元素插入到队列中。
  • peek():获取队列头部的元素,但不删除该元素。如果队列为空,则返回 null。
  • poll():获取并删除队列头部的元素。如果队列为空,则返回 null。
  • remove(Object o):从队列中删除指定元素。
  • size():获取队列中元素的数量。

另外,需要注意的是,PriorityQueue 不支持随机访问操作。如果需要随机访问操作,建议使用其他数据结构,例如 ArrayList 或 LinkedList。

下面是 PriorityQueue 的使用示例:

import java.util.PriorityQueue;public class PriorityQueueExample {public static void main(String[] args) {// 创建一个空的 Priority Queue,默认元素按照自然顺序排序PriorityQueue<Integer> pq = new PriorityQueue<>();// 添加元素到 Priority Queuepq.offer(5);pq.offer(3);pq.offer(8);// 获取并删除队列头部的元素,按照优先级顺序输出while (!pq.isEmpty()) {System.out.println(pq.poll()); // 输出结果:3 5 8}// 创建一个自定义排序规则的 Priority QueuePriorityQueue<String> pq2 = new PriorityQueue<>((s1, s2) -> s2.length() - s1.length()); // 按照字符串长度降序排序// 添加元素到 Priority Queuepq2.offer("apple");pq2.offer("banana");pq2.offer("cherry");// 获取并删除队列头部的元素,按照自定义排序规则输出while (!pq2.isEmpty()) {System.out.println(pq2.poll()); // 输出结果:banana cherry apple}}
}

在上面的示例中,我们创建了一个空的 PriorityQueue 对象,并依次添加了元素 5、3、8。然后使用 poll() 方法遍历该队列,并按照优先级顺序获取并删除元素。最终的输出结果为 3、5、8。

当使用 PriorityQueue 时,可以通过自然顺序或自定义 Comparator 来定义元素的排序规则。以下是一些示例:

  1. 使用自然顺序排序的示例:
import java.util.PriorityQueue;public class NaturalOrderExample {public static void main(String[] args) {// 使用自然顺序排序(整数)PriorityQueue<Integer> pq = new PriorityQueue<>();pq.offer(5);pq.offer(3);pq.offer(8);while (!pq.isEmpty()) {System.out.println(pq.poll()); // 输出结果:3 5 8}}
}
  1. 使用自定义 Comparator 定义排序规则的示例:
import java.util.Comparator;
import java.util.PriorityQueue;public class CustomComparatorExample {public static void main(String[] args) {// 使用自定义的 Comparator 来定义排序规则(字符串长度降序)PriorityQueue<String> pq = new PriorityQueue<>(Comparator.comparingInt(String::length).reversed());pq.offer("apple");pq.offer("banana");pq.offer("cherry");while (!pq.isEmpty()) {System.out.println(pq.poll()); // 输出结果:banana cherry apple}}
}
  1. 使用自定义对象和 Comparator 示例:
import java.util.Comparator;
import java.util.PriorityQueue;class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}public class CustomObjectComparatorExample {public static void main(String[] args) {// 使用自定义的 Comparator 来定义排序规则(按照年龄升序)PriorityQueue<Person> pq = new PriorityQueue<>(Comparator.comparingInt(Person::getAge));pq.offer(new Person("Alice", 25));pq.offer(new Person("Bob", 30));pq.offer(new Person("Charlie", 20));while (!pq.isEmpty()) {Person person = pq.poll();System.out.println(person.getName() + " - " + person.getAge());}}
}

在以上示例中,我们分别展示了使用自然顺序和自定义 Comparator 定义 PriorityQueue 的排序规则的几种情况。这些示例演示了如何根据不同的需求对元素进行排序。

当我们需要将 PriorityQueue 定义为最大堆时,可以使用 Collections.reverseOrder() 方法来反转元素的自然顺序或者指定的 Comparator,从而实现最大堆的效果。以下是一个示例:

import java.util.Collections;
import java.util.PriorityQueue;public class MaxHeapExample {public static void main(String[] args) {// 使用 Collections.reverseOrder() 反转自然顺序,定义 PriorityQueue 为最大堆PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());maxHeap.offer(5);maxHeap.offer(3);maxHeap.offer(8);while (!maxHeap.isEmpty()) {System.out.println(maxHeap.poll()); // 输出结果:8 5 3}}
}

在这个示例中,我们使用了 Collections.reverseOrder() 方法来反转自然顺序,将 PriorityQueue 定义为最大堆。最终的输出结果为 8、5、3,符合最大堆的特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/237937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

等待队列头实现阻塞 IO(BIO)

文章目录 等待队列头实现阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 等待队列头实现阻塞 IO(BIO) 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构&#xff0c;链表头和…

苹果如何从iCloud恢复备份?正确方法看这里!

iCloud为所有苹果用户免费提供5G内存空间&#xff0c;用户可以将照片、短信、联系人、备忘录等重要信息备份到iCloud云端&#xff0c;这样可以方便在不同设备之间同步和共享。 同时&#xff0c;iCloud保证这些数据在所有苹果设备上及时自动更新。当遇到手机数据丢失时&#xf…

构建搜索引擎,而非向量数据库(Vector DB) [译]

原文&#xff1a;Build a search engine, not a vector DB 作者&#xff1a; Panda Smith 在过去 12 个月中&#xff0c;我们见证了向量数据库&#xff08;Vector DB&#xff09;创业公司的迅猛增长。我此刻并不打算深入探讨它们各自的设计取舍。相反&#xff0c;我更想探讨和…

做外贸多想一步,多走一步

最近在网上给小儿买了一个液晶画画板&#xff0c;自从告诉小儿已经购物需要耐心等待之后&#xff0c;几乎每天小儿要询问几遍&#xff0c;快递到哪里了&#xff1f; 好不容易盼到了&#xff0c;结果打开一看却是个坏的&#xff0c;虽然外包装是好的&#xff0c;但是明显这个快…

数据库客户案例:每个物种都需要一个数据库!

1、GERDH——花卉多组学数据库 项目名称&#xff1a;GERDH&#xff1a;花卉多组学数据库 链接地址&#xff1a;https://dphdatabase.com 项目描述&#xff1a;GERDH包含了来自150多种园艺花卉植物种质的 12961个观赏植物。将不同花卉植物转录组学、表观组学等数据进行比较&am…

读《文明之光》第四册总结

今天来给大家分享一下【吴军】老师的《文明之光》&#xff0c;该书全套共四册&#xff0c;今天给大家分享的是第四册。 人总是要有些理想和信仰。初读这本书&#xff0c;就被本书的第一句话说感动过。 当人们问起我的理想时&#xff0c;我就给他们讲…

Linux | 数据结构之内核链表

Linux | 数据结构之内核链表 时间:2023年12月20日15:42:45 文章目录 Linux | 数据结构之内核链表1.参考2.内核链表2-1.源码2-2.节点类型2-3.内核链表相关算法2-3-1.初始化`2-3-1-1`.宏的实现2-3-1-2.内联函数的实现2-3-2.插入`2-3-2-1`.将new指向的结点插入到head指向的结点后…

Patreon怎么订阅付款?Patreon会员订阅付款保姆级教程,用虚拟VISA卡订阅Patreon作者艺术家

Patreon 是目前世界上最受欢迎的会员平台之一。 内容创作者和艺术家通常很难让粉丝在经济上支持他们。 通过使用像 Patreon 这样的平台&#xff0c;创作者和艺术家可以很容易地从他们的作品中获得报酬。粉丝也能更方便的支持他们&#xff0c;今天就教大家如何订阅Patreon 首先我…

MySQL 5.6较上一版本的关键升级

MySQL 5.6是一个主要的版本发布&#xff0c;它在性能、可伸缩性、可靠性和可用性方面引入了多项重要改进和新特性。它在2013年发布&#xff0c;相比于它的前身MySQL 5.5&#xff0c;MySQL 5.6带来了以下关键升级&#xff1a; 优化的InnoDB存储引擎&#xff1a;MySQL 5.6中的Inn…

8.点云获取和数据处理(python)

点云数据获取和处理的代码如下&#xff1a; 一、用DBSCAN聚类的方法处理点云数据 通过设置点云坐标的最大聚类对点云坐标进行归类&#xff0c;再将相同类的坐标求均值&#xff08;中心点坐标&#xff09;&#xff0c;这些均值坐标通过手眼标定的转换矩阵转换为二维的相机坐标&…

k8s中Chart的命名模板

Chart的命名模板 命名模板有时候也被称为部分或子模板。 相对于 deployment.yaml 这种主模板&#xff0c;命名模板只是定义部分通用内容&#xff0c;然后在各个主模板中调用。 templates目录下有个_helpers.tpl文件。公共的命名模板都放在这个文件里。 命名模板使用 define…

Python中最常用的10个内置函数!

Python作为一种多用途编程语言&#xff0c;拥有丰富的内置函数库&#xff0c;这些函数可以极大地提高开发效率。本文将介绍Python中最常用的10个内置函数&#xff0c;它们的功能各有不同&#xff0c;但在实际编程中经常派上用场。我们将深入了解每个函数&#xff0c;并提供示例…

解锁高效工作!5款优秀工时管理软件推荐

工时管理&#xff0c;一直是让许多企业和团队头疼的问题。传统的纸质工时表、复杂的电子表格&#xff0c;不仅操作繁琐&#xff0c;还容易出错。幸好&#xff0c;随着科技的进步&#xff0c;我们迎来了工时管理软件的春天。今天&#xff0c;就让我们一起走进这个新时代&#xf…

2016年第五届数学建模国际赛小美赛B题直达地铁线路解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 B题 直达地铁线路 原题再现&#xff1a; 在目前的大都市地铁网络中&#xff0c;在两个相距遥远的车站之间运送乘客通常需要很长时间。我们可以建议在两个长途车站之间设置直达班车&#xff0c;以节省长途乘客的时间。   第一部分&#xf…

【银行测试】银行金融测试+金融项目测试点汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行金融测试是…

EOCR-i3M420/iFM420施耐德智能通讯保护继电器产品简介

EOCR-i3M420/iFM420是施耐德EOCR的新一代电子式电动机保护器产品&#xff0c;具有过电流、欠电流、缺相、逆相、堵转、失速、三相不平衡等保护功能&#xff0c;并具有4-20mA电流输出功能。EOCR-i3M420/iFM420是通讯型产品&#xff0c;提供Modbus RTU通讯协议&#xff0c;RS485接…

从零实现一套低代码(保姆级教程) --- 【3】实现Button组件和画布区的拖拽

摘要 目前是每天更新一篇&#xff0c; 因为我不止要写文章&#xff0c;这些代码也是我正在敲的。可能速度没有那么快&#xff0c;但是这个频率感觉还是可以的。 本篇是这个系列的第三篇&#xff0c;如果你是第一次看到这个文章&#xff0c;那你应该会对低代码有那么一丢丢兴趣…

中小型教育网络安全解决方案

热门IT技术视频教程&#xff1a;https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 一、中小型教育网络的安全现状及挑战 当前&#xff0c;校园网的安全形势非常严峻&#xff0c;大量的垃圾邮件、黑客攻击、病毒蠕虫等困扰着管理者。而且这些作…

福建农林大学 html +css + JavaScript 期末复习 -- 保姆级

html css JavaScript 期末复习&#xff08;保姆级复盘&#xff09; 考试题型 1、选择题 20题 30分 2、判断题 15题 15分 3、程序题 3 题 30分 4、综合题 2 题 25分 1、网页第一代文本标签&#xff08;直接上代码&#xff0c;看保姆级注解&#xff09; <!-- doctype: docum…

ArcGIS基础:便捷查看外业照片及识别举证照片方位角

打开工具&#xff1a;【地理标记照片转点】。 打开工具后&#xff0c;输入文件夹&#xff0c;并对相应的参数进行勾选。 右键&#xff0c;图层属性&#xff0c;打开【显示】&#xff0c;对【超链接】设置等参数进行勾选。 找到【符号系统】&#xff0c;点击【高级】&#xff…