0


Java之PriorityQueue的用法

目录

PriorityQueue用法

一、基本概念

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

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


二、常用方法总结

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

三、具体使用

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

方式一、lambda表达式

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

方式二、重写compare方法

PriorityQueue<Integer> queue =newPriorityQueue<>(newComparator<Integer>(){@Overridepublicintcompare(Integer o1,Integer o2){return o2 - o1;}});

2、实现自定义排序

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

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

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

publicclassSolution{publicstaticvoidmain(String[] args){PriorityQueue<People> queue =newPriorityQueue<>((o1, o2)->{if(o1.getName().compareTo(o2.getName())>0){return1;}elseif(o1.getName().compareTo(o2.getName())<0){return-1;}else{if(o1.getAge()> o2.getAge()){return1;}elseif(o1.getAge()< o2.getAge()){return-1;}else{if(o1.getHeight()- o2.getHeight()>0){return1;}elseif(o1.getHeight()- o2.getHeight()<0){return-1;}else{return0;}}}});People one =newPeople("one",12,45.6f);People two =newPeople("one",12,12.3f);
        queue.add(one);
        queue.add(two);for(People tmp : queue){System.out.println(tmp);}}}classPeople{privateString name;privateint age;privatefloat height;publicPeople(String name,int age,float height){this.name = name;this.age = age;this.height = height;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){return age;}publicvoidsetAge(int age){this.age = age;}publicfloatgetHeight(){return height;}publicvoidsetHeight(float height){this.height = height;}@OverridepublicStringtoString(){return"people{"+"name='"+ name +'\''+", age="+ age +", height="+ height +'}';}}

3、解决TOP K问题

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

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

标签: java intellij-idea

本文转载自: https://blog.csdn.net/weixin_43583736/article/details/127472973
版权归原作者 minh_coo 所有, 如有侵权,请联系我们删除。

“Java之PriorityQueue的用法”的评论:

还没有评论