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

Java—PriorityQueue用法

Java—PriorityQueue用法

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

在这里插入图片描述

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

PriorityQueue 是基于二叉小顶堆(binary min-heap)实现的。

在这里插入图片描述

堆是一种特殊的树形数据结构,其中每个节点的值都必须大于等于或小于等于其子树中每个节点的值,具体取决于是最小堆还是最大堆。
在这里插入图片描述

PriorityQueue 中,堆的根节点(即顶部)总是具有最高(或最低,取决于比较器)优先级的元素。
在这里插入图片描述

这使得可以在 O(log n) 的时间复杂度内获取并移除队列中优先级最高的元素,或者在常数时间内检索优先级最高的元素,这是 PriorityQueue 在处理优先级队列时的关键优势。
在这里插入图片描述

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

  • offer(E e):将指定元素插入到队列中。
  • peek():获取队列头部的元素,但不删除该元素。如果队列为空,则返回 null。
  • poll():获取并删除队列头部的元素。如果队列为空,则返回 null。
  • remove(Object o):从队列中删除指定元素。
  • size():获取队列中元素的数量。
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 时,可以通过自然顺序或自定义 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}}
}

2. 使用自定义 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}}
}

3. 使用自定义对象和 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());}}
}

当需要将 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}}
}
http://www.lryc.cn/news/2420276.html

相关文章:

  • AdminLTE的使用
  • 数学建模——解决评价类问题:优劣解距离法(TOPSIS法)
  • Sniffer原理解析
  • Libevent的使用
  • 关于MDL的一些事情
  • 802.1X 身份验证:基于端口的网络访问控制协议
  • TS---基础
  • 在线URL解码还原工具
  • HTML——基础结构以及常见标签
  • 【几种常见的流程模型介绍】
  • Linux中的8个ldd命令示例
  • AIO,BIO,NIO详解
  • 360p2刷无线打印服务器,【联网版】360路由器P2刷tomato固件小白教程
  • U盘启动盘安装系统,使用Diskpart命令对磁盘进行分区
  • Source Insight (SI) 变量、函数、宏定义变成黑色,无法快速查看调用的几种解决方法_sourceinsight变量变黑
  • OpenJudge NOI 1.8 24:蛇形填充数组
  • 凯撒密码加密和解密的算法实现
  • MYSQL中什么是规范化_数据库规范化原理基础介绍
  • Zookeeper安装部署与基本使用
  • 数据结构—平衡二叉树(AVL树)的原理以及Java代码的完全实现
  • 通达OA工作流设计-关联子菜单(多级联动)及数据选择控件应用
  • static_cast、const_cast用法
  • 802.11 a/b/g/n/ac/ax/be 有什么区别
  • HTTP状态码——413
  • API网关的6个主要作用(非常详细)零基础入门到精通,收藏这一篇就够了
  • A级IDC数据机房具体是怎么样的?
  • origin绘图软件中文版下载和安装教程
  • 什么是类?以及类的分类
  • 什么是非对称加密?非对称加密算法介绍
  • 集群联邦(Federation)