Java之PriorityQueue的用法
目录
- PriorityQueue用法
- 一、基本概念
- 二、常用方法总结
- 三、具体使用
- 1、实现降序排列(大顶堆)
- 2、实现自定义排序
- 3、解决TOP K问题
PriorityQueue用法
一、基本概念
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>() {@Overridepublic 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;}@Overridepublic String toString() {return "people{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}
3、解决TOP K问题
问题场景:从十亿个数中取最大/最小的100个数
解决方案:先取100个数构成小顶堆/大顶堆,后续每来一个数都与队头元素进行判断,比它小就直接丢弃,比它大就进队列中,直至访问完毕,最后剩下的即为所求答案。
Java之PriorityQueue的用法相关推荐
- java priorityqueue_Java PriorityQueue offer()用法及代码示例
java.util.PriorityQueue.offer()方法用于将特定元素插入优先级队列.它的行为类似于优先级队列的add()方法. 用法: Priority_Queue.offer(Objec ...
- JAVA中priorityqueue详解
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...
- java中的基本用法
java中的基本用法 关键字:专门用途的字符串 所有java关键字都是小写英文 标识符 java常量 java变量 ■ 作用域:起作用的区域■ 使用前必须先声明,在赋值.使用变量名访问这块区域 jav ...
- Java中getResourceAsStream的用法
Java中getResourceAsStream的用法 首先,Java中的getResourceAsStream有以下几种: 1. Class.getResourceAsStream(String p ...
- Java中getResourceAsStream的用法小结
2019独角兽企业重金招聘Python工程师标准>>> Java中getResourceAsStream的用法小结 一.Java中的getResourceAsStream主要有以下三 ...
- java中substring的用法
2019独角兽企业重金招聘Python工程师标准>>> java中substring的用法 str=str.substring(int beginIndex);截取掉str从首字母起 ...
- java优先队列PriorityQueue修改队列内元素排序问题
今天发现了新大陆.我以前一直以为,PriorityQueue队列是基于堆排序的不断更新排序的,没错,它是不断更新排序的.但是前提是要插入(删除)数据,如果仅仅是修改已经稳定队列的值或内容,而不进行插入 ...
- JAVA中Final的用法
JAVA中Final的用法 1. 修饰基础数据成员的final 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改.如java.lang.Math类中的 ...
- Java队列 PriorityQueue
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120829314 本文出自[赵彦军的博客] Java队列 Queue Java队列 ...
最新文章
- 听说,英特尔要对外开放 x86 授权?
- Angular 下的 directive (part 2)
- Markdown:数学公式练习(3)
- ISA Server 2007 beta TAP 开始招人
- 数据结构-堆(最大堆)
- python学习HTML之CSS(2)
- 电脑控制苹果手机_必备神器,电脑控制手机
- 一次回母校教前端的经历
- Feature Flag 功能发布控制
- 3389改为3390端口如何改
- linux vi脚本,linux下vi(vim)的新的用法总结
- java的VIRT高的问题理解
- 多边多面形成体_Nature Comm | 中科院分子植物卓越中心巫永睿团队揭示类胡萝卜素影响玉米硬质胚乳形成的新机制...
- vscode 分析c代码_vs code(C语言)配置教程
- Redis五大数据类型以及操作---散列表
- 【好文翻译】10个免费的压力测试工具(Web)
- 身为程序员就算月薪再高,想找女朋友的话这些你千万别做!
- Linux Cgroup cpu子系统实验
- 目前免费用可用的天气api接口及失效接口
- 数字数据转换为字符数据_为什么替代数据对数字转换至关重要