文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java之PriorityQueue的用法

2023-08-19 21:15

关注

一、基本概念

PriorityQueue(优先队列),在概念上,默认为小顶堆,元素单调递增排序。也可通过传入Comparator,重写其中的compare方法自定义排序规则;

在实现上,PriorityQueue实现了Queue接口,使用数组来存储数据,按照每层从左到右的顺序存放,因此它不允许存入null值。


二、常用方法总结

方法作用
add();队尾插入元素,调整堆结构,失败时抛异常
offer();队尾插入元素,调整堆结构,失败时抛false
remove();根据value值删除指定元素,调整堆结构,失败时抛异常
poll();删除队头元素,调整堆结构,失败时抛null
element();获取队列头元素
peek();获取队列头元素
clear();清空队列
size();获取队列元素个数
contains();判断队列中是否包含指定元素
isEmpty();判断队列是否为空

三、具体使用

1、实现降序排列(大顶堆)

方式一、lambda表达式

PriorityQueue<Integer> queue = new PriorityQueue<>(                (o1, o2) -> o2 - o1        );

方式二、重写compare方法

PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {            @Override            public int compare(Integer o1, Integer o2) {                return o2 - o1;            }        });

2、实现自定义排序

示例一、按字符串的第三位进行降序排列

PriorityQueue<String> queue = new PriorityQueue<>(                (o1, o2) -> o2.charAt(2) - o1.charAt(2)        );

示例二、自定义一个类People,先按名字排序,再按年龄排序,再按身高排序

public class Solution {    public static void main(String[] args) {        PriorityQueue<People> queue = new PriorityQueue<>(                (o1, o2) -> {                    if (o1.getName().compareTo(o2.getName()) > 0) {                        return 1;                    } else if (o1.getName().compareTo(o2.getName()) < 0) {                        return -1;                    } else {                        if (o1.getAge() > o2.getAge()) {return 1;                        } else if (o1.getAge() < o2.getAge()) {return -1;                        } else {if (o1.getHeight() - o2.getHeight() > 0) {    return 1;} else if (o1.getHeight() - o2.getHeight() < 0) {    return -1;} else {    return 0;}                        }                    }                }        );        People one = new People("one", 12, 45.6f);        People two = new People("one", 12, 12.3f);        queue.add(one);        queue.add(two);        for (People tmp : queue) {            System.out.println(tmp);        }    }}class People {    private String name;    private int age;    private float height;    public People(String name, int age, float height) {        this.name = name;        this.age = age;        this.height = height;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public float getHeight() {        return height;    }    public void setHeight(float height) {        this.height = height;    }    @Override    public String toString() {        return "people{" +                "name='" + name + '\'' +                ", age=" + age +                ", height=" + height +                '}';    }}

3、解决TOP K问题

问题场景:从十亿个数中取最大/最小的100个数

解决方案:先取100个数构成小顶堆/大顶堆,后续每来一个数都与队头元素进行判断,比它小就直接丢弃,比它大就进队列中,直至访问完毕,最后剩下的即为所求答案。

来源地址:https://blog.csdn.net/weixin_43583736/article/details/127472973

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯