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());
        }
    }

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

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<Integer> 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());
        }
    }

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

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

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

代码示例:

    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]);
        }
    }

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

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木是木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值