• Java优先队列PriorityQueue中的方法和使用细节总结


    今天稍稍了解了一下Java中的优先队列PriorityQueue,做了以下总结。


    PriorityQueue中的方法:

    要了解PriorityQueue,首先我们应该了解其中比较常用的方法,如下。

    在这里插入图片描述(导图非本人所画)


    使用细节:

    首先是他的排序规则,优先队列默认是小根堆,即升序排序,我们可以通过如下代码验证。

    代码示例:

        public static void main(String[] args) {
            PriorityQueue<Integer> queue = new PriorityQueue<>();
            queue.add(5);
            queue.add(4);
            queue.add(3);
            queue.add(2);
            queue.add(1);
            while(!queue.isEmpty()){
                System.out.println(queue.poll());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果输出:
    在这里插入图片描述

    PS:由上图结果可知,PriorityQueue给我们提供了一个默认的排序方法,为n1-n2,这是一种普遍的比较方法,但是如果我们想改变队列的排序,把它改成大根堆(降序排序),我们可以通过在构造队列时new一个新的比较器实现。

    改为大根堆代码:

        public static void main(String[] args) {
            //new 一个比较器
            PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
                @Override
                public int compare(Integer n1, Integer n2) {
                    //默认n1-n2,我们将它改为n2-n1
                    return n2-n1;
                }
            });
            //new 一个比较器
            //匿名函数+lambda表达式
            //PriorityQueue queue = new PriorityQueue<>((n1, n2) -> n2 - n1);
            queue.add(4);
            queue.add(3);
            queue.add(2);
            queue.add(5);
            queue.add(1);
            while(!queue.isEmpty()){
                System.out.println(queue.poll());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    结果输出:
    在这里插入图片描述

    引用数据类型的优先队列:

    如果我们要往队列中插入数组,类对象等引用数据类型时,我们则需要自己重写一个比较器方法,因为系统不知道我们需要怎么排序,也没有对应的方法来给我们排序,所以我们要自己写一个。

    代码示例:

        public static void main(String[] args) {
            PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
                @Override
                public int compare(int[] arr1, int[] arr2) {
                    return arr1[0]-arr2[0];
                }
            });
            queue.add(new int[]{2,1});
            queue.add(new int[]{3,4});
            queue.add(new int[]{1,5});
            while(!queue.isEmpty()){
                int[] poll = queue.poll();
                System.out.println(poll[0]+" : "+poll[1]);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    如上所示,插入数组,我们以数组的第一个元素为比较内容,才可以正常输出,若不重写,则无法运行代码。

    结果输出:
    在这里插入图片描述

  • 相关阅读:
    DoTween简单的API,以及一些回调
    meterpreter命令
    Python的一些基础实操练习题
    内边距(padding会影响盒子内边距大小)
    荣获国家高新技术企业认证,苹芯科技领航AI芯片产业发展
    薯条和洱海:第十五周马克思主义原理第八章:社会主义百年历史进程课程B站讲课大纲:
    【综合练习12】实现静态网页的相关功能
    讯飞星火V4.0 发布,全面对标GPT-4 Turbo
    使用vue-cli搭建SPA项目
    pdfgear:免费易用的pdf处理软件,轻松进行pdf文件转换、阅读、编辑等
  • 原文地址:https://blog.csdn.net/qq_53130059/article/details/126750351