Java 中的优先级队列详细介绍

这篇具有很好参考价值的文章主要介绍了Java 中的优先级队列详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.介绍

  • 当应该根据优先级处理对象时,将使用 PriorityQueu
  • 众所周知Queue遵循先进先出算法的,但是有时候需要按照优先级来处理队列中的元素,这时候PriorityQueue就派上用场了。
  • PriorityQueue 基于优先级堆
  • 优先级队列的元素根据自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数
    java先进先出队列,# Java,# 算法和数据结构,java,算法,开发语言
    在下面的优先级队列中,具有最大 ASCII 值的元素将具有最高优先级
    java先进先出队列,# Java,# 算法和数据结构,java,算法,开发语言
public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable

where E is the type of elements held in this queue

Priority Queue的几个要点如下:

  • PriorityQueue 不允许 null
  • 我们不能创建不可比较对象的 PriorityQueue PriorityQueue 是非绑定队列
  • 该队列的头部是相对于指定顺序的最少元素
  • 如果多个元素绑定到最小值,则头部就是这些元素之一——绑定被任意打破。
  • 由于 PriorityQueue 不是线程安全的,java 提供了实现 BlockingQueue 接口PriorityBlockingQueue 类以在 java 多线程环境中使用。
  • 队列检索操作 poll、remove、peek 和 element 访问队列头部的元素。
  • 它为添加和轮询方法提供 O(log(n)) 时间。 它继承了 AbstractQueue、AbstractCollection、Collection 和 Object 类的方法。

构造函数:

  1. PriorityQueue():创建一个具有默认初始容量 (11) 的 PriorityQueue,它根据元素的自然顺序对其元素进行排序
    PriorityQueue<E> pq = new PriorityQueue<E>();
  2. PriorityQueue(Collection c):创建一个包含指定集合中的元素的 PriorityQueue。
    PriorityQueue<E> pq = new PriorityQueue<E>(Collection<E> c);
  3. PriorityQueue(int initialCapacity):创建一个具有指定初始容量的 PriorityQueue,它根据元素的自然顺序对其元素进行排序。
    PriorityQueue<E> pq = new PriorityQueue<E>(int initialCapacity);
  4. PriorityQueue(int initialCapacity, Comparator comparator):创建一个具有指定初始容量的 PriorityQueue,它根据指定的比较器对其元素进行排序。
    PriorityQueue<E> pq = new PriorityQueue(int initialCapacity, Comparator<E> comparator);
  5. PriorityQueue(PriorityQueue c):创建一个包含指定优先级队列中元素的PriorityQueue。PriorityQueue<E> pq = new PriorityQueue(PriorityQueue<E> c);
  6. PriorityQueue(SortedSet c):创建一个包含指定排序集合中元素的PriorityQueue
    PriorityQueue<E> pq = new PriorityQueue<E>(SortedSet<E> c);

下面的例子解释了优先级队列的以下基本操作。

  • boolean add(E element):此方法将指定元素插入此优先级队列
  • public peek():此方法检索但不删除此队列的头部,如果此队列为空,则返回 null。
  • public poll():此方法检索并移除此队列的头部,如果此队列为空,则返回 null。
public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>();
        pQueue.add(10);
        pQueue.add(20);
        pQueue.add(15);
        System.out.println(pQueue);
        System.out.println(pQueue.peek());//检索但不删除此队列的头部
        System.out.println(pQueue.poll());//检索并移除此队列的头部
        System.out.println(pQueue.peek());
    }
}
[10, 20, 15]
10
10
15

2.对 PriorityQueue 的操作

让我们看看如何在优先级队列类上执行一些常用的操作。

1. 添加元素

  • 添加元素:为了在优先级队列中添加元素,我们可以使用 add() 方法。
  • 插入顺序不保留在 PriorityQueue 中。元素按优先级顺序存储默认为升序
public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
        for (int i = 0; i < 3; i++) {
            pq.add(i);
            pq.add(1);

        }
        System.out.println(pq);
    }
}
[0, 1, 1, 1, 2, 1]

我们不会通过打印 PriorityQueue 来获得已排序的元素。

public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
        System.out.println(pq);
    }
}
[For, Geeks, Geeks]

2. 删除元素

删除元素:为了从优先队列中删除一个元素,我们可以使用remove()方法。
如果有多个这样的对象,则删除第一个出现的对象。除此之外,poll() 方法还用于移除头部并将其返回

public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
        System.out.println("Initial PriorityQueue " +pq);
        pq.remove("Geeks");//移除指定元素

        System.out.println("After Remove - " + pq);

        System.out.println("Poll Method - " + pq.poll());//从头部移除

        System.out.println("Final PriorityQueue - " + pq);
    }
}
Initial PriorityQueue [For, Geeks, Geeks]
After Remove - [For, Geeks]
Poll Method - For
Final PriorityQueue - [Geeks]

3. 访问元素

  • 访问元素: 由于Queue遵循先进先出的原则,我们只能访问队列的头部
  • 要访问优先级队列中的元素,我们可以使用 peek() 方法
public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
        System.out.println("Initial PriorityQueue " +pq);
        String element = pq.peek();
        System.out.println("Accessed Element: " + element);
    }
}
Initial PriorityQueue [For, Geeks, Geeks]
Accessed Element: For

4.迭代PriorityQueue

迭代PriorityQueue:有多种方法可以迭代PriorityQueue。
最著名的方法是将队列转换为数组并使用 for 循环遍历。但是,队列还有一个内置的迭代器,可用于遍历队列文章来源地址https://www.toymoban.com/news/detail-627665.html

public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
        System.out.println(pq);
        Iterator it= pq.iterator();
        while (it.hasNext()){
            System.out.println(it.next()+" ");
        }
    }
}
[For, Geeks, Geeks]
For 
Geeks 
Geeks 

3.PriorityQueue 类中的方法

方法 描述
add(E e) 将指定元素插入此优先级队列。
clear() 从此优先级队列中删除所有元素。
comparator() 返回用于对该队列中的元素进行排序的比较器,如果该队列是根据其元素的自然顺序排序的,则返回 null。
contains​(Object o) 如果此队列包含指定元素,则返回 true。
forEach​(Consumer<? super E> action) 对 Iterable 的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。
iterator() 返回此队列中元素的迭代器。
offer​(E e) 将指定元素插入此优先级队列。
remove​(Object o) 从此队列中移除指定元素的单个实例(如果存在)。
removeAll​(Collection<?> c) 删除此集合的所有也包含在指定集合中的元素(可选操作)。
removeIf​(Predicate<? super E> filter) 移除此集合中满足给定谓词的所有元素。
retainAll​(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
spliterator() 在此队列中的元素上创建一个后期绑定和快速失败的 Spliterator。
toArray() 返回包含此队列中所有元素的数组。
toArray​(T[] a) 返回一个包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的类型。

到了这里,关于Java 中的优先级队列详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 堆(优先级队列)详解

    如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki = K2i+1 且 Ki= K2i+2 (Ki = K2i+1 且 Ki = K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小

    2024年02月08日
    浏览(48)
  • 【堆的认识及其优先级队列】java代码实现,保姆级教程学习堆和优先级队列

    前言: 大家好,我是 良辰 丫💞💞⛽,我们又见面了,前面我们讲了用链表实现的二叉树,今天我们来接触 堆 的概念,堆是一种特殊的二叉树,只不过咱们的对底层原理是数组,堆也是我们在做题中经常见到的,那么,接下来我们就慢慢的去接触堆, 认识堆,理解堆,掌

    2024年02月02日
    浏览(53)
  • Java 数据结构篇-用数组、堆实现优先级队列

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍    文章目录         1.0 优先级队列说明         2.0 用数组实现优先级队列         3.0 无序数组实现优先级队列         3.1 无序数组实现优先级队列 - 入队列 offer(E value)         3.2 无序数组实现优先

    2024年02月04日
    浏览(46)
  • 华为OD机试 - 支持优先级的队列(Java & JS & Python)

    题目描述 实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。 如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。 队列存储的数据内容是一个整数。 输入描述 一组待存入队列的数据 (包含内容和优先级) 输出描述 队列的数据内容(优先级

    2024年02月13日
    浏览(49)
  • 【华为OD统一考试B卷 | 100分】支持优先级的队列(C++ Java JavaScript Python)

    在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 运行出现 Runtime Error 0Aborted,请忽略 华为OD统一考试A卷+B卷 新题库说明 2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。 你收到的链接上面会标注A卷还是B卷。

    2024年02月13日
    浏览(41)
  • 【C++初阶10-stack&queue】STL中的栈和队列(附优先级队列

    本期分享:STL中的栈和队列。 在数据结构初阶时,我们已经学习这来那个两种数据结构,如今来看STL中的,不过是更加标准化。而实现起来,会简单得超乎你想象! 文中不足错漏之处望请斧正! STL中的栈和队列是容器适配器。容器适配器是对某种已有容器的再次封装。 比如

    2024年02月06日
    浏览(47)
  • 【C++】STL优先级队列(priority_queue)功能介绍以及模拟实现

    点进来的小伙伴不知道学过数据结构里的堆没有,如果学过的话,那就好说了,优先级队列就是堆,如果没学过,没关系,可以参考一下我之前写的一篇关于堆的博客,可以点进去看看:【数据结构】堆(包含堆排序和TOPK问题) 那么了解过堆了的话,我就不讲那么细致了,

    2024年02月16日
    浏览(49)
  • 【C++】STL——容器适配器priority_queue(优先级队列)详解 及 仿函数的介绍和使用

    这篇文章我们接着上一篇的内容,再来学一个STL里的容器适配器—— priority_queue (优先级队列) 1.1 priority_queue的介绍 我们上一篇文章学了 queue (队列),那优先级队列也是在 queue 里面的: 和 queue 一样, priority_queue 也是一个容器适配器,那他和 queue 有什么区别呢?我们一

    2024年02月07日
    浏览(48)
  • [C++] STL_priority_queue(优先级队列) 的使用及底层的模拟实现,容器适配器,deque的原理介绍

    priority_queue文档介绍 翻译: 1. 优先队列是一种 容器适配器 ,根据严格的弱排序标准, 它的第一个元素总是它所包含的元素中最大的。 2. 此上下文类似于 堆 , 在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 3. 优先队列被实现为容器适配

    2024年02月04日
    浏览(47)
  • Java 运算符优先级

    在 Java 中,每个运算符都有一个优先级,优先级高的运算符会先执行,而优先级低的运算符会后执行。如果有多个运算符在同一个表达式中出现,那么需要按照运算符优先级的规则确定它们的执行顺序。 Java 运算符的优先级如下所示(从高到低): 后缀运算符:++、– 一元运

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包