Java中关于优先队列PriorityQueue详解
一、优先队列概述
优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序,
可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类
对于基本数据类型的包装器类,优先队列中元素默认排列顺序是升序排列
但对于自己定义的类来说,需要自己定义比较器
二、常用方法
1 2 3 4 5 | peek() //返回队首元素 poll() //返回队首元素,队首元素出队列 add() //添加元素 size() //返回队列元素个数 isEmpty() //判断队列是否为空,为空返回true,不空返回false |
三、优先队列的使用
1.队列保存的是基本数据类型的包装类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | //自定义比较器,降序排列 static Comparator<Integer> cmp = new Comparator<Integer>() { public int compare(Integer e1, Integer e2) { return e2 - e1; } }; public static void main(String[] args) { //不用比较器,默认升序排列 Queue<Integer> q = new PriorityQueue<>(); q.add( 3 ); q.add( 2 ); q.add( 4 ); while (!q.isEmpty()) { System.out.print(q.poll()+ " " ); } /** * 输出结果 * 2 3 4 */ //使用自定义比较器,降序排列 Queue<Integer> qq = new PriorityQueue<>(cmp); qq.add( 3 ); qq.add( 2 ); qq.add( 4 ); while (!qq.isEmpty()) { System.out.print(qq.poll()+ " " ); } /** * 输出结果 * 4 3 2 */ } |
2.队列保存的是自定义类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | //矩形类 class Node{ public Node( int chang, int kuan) { this .chang=chang; this .kuan=kuan; } int chang; int kuan; } public class Test { //自定义比较类,先比较长,长升序排列,若长相等再比较宽,宽降序 static Comparator<Node> cNode= new Comparator<Node>() { public int compare(Node o1, Node o2) { if (o1.chang!=o2.chang) return o1.chang-o2.chang; else return o2.kuan-o1.kuan; } }; public static void main(String[] args) { Queue<Node> q= new PriorityQueue<>(cNode); Node n1= new Node( 1 , 2 ); Node n2= new Node( 2 , 5 ); Node n3= new Node( 2 , 3 ); Node n4= new Node( 1 , 2 ); q.add(n1); q.add(n2); q.add(n3); Node n; while (!q.isEmpty()) { n=q.poll(); System.out.println( "长: " +n.chang+ " 宽:" +n.kuan); } /** * 输出结果 * 长: 1 宽:2 * 长: 2 宽:5 * 长: 2 宽:3 */ } } |
3.优先队列遍历
PriorityQueue的iterator()不保证以任何特定顺序遍历队列元素。
若想按特定顺序遍历,先将队列转成数组,然后排序遍历
示例
1 2 3 4 5 6 7 | 3 .优先队列遍历 PriorityQueue的iterator()不保证以任何特定顺序遍历队列元素。 若想按特定顺序遍历,先将队列转成数组,然后排序遍历 示例 |
4.比较器生降序说明
1 2 3 4 5 6 7 8 | Comparator<Object> cmp = new Comparator<Object>() { public int compare(Object o1, Object o2) { //升序 return o1-o2; //降序 return o2-o1; } }; |
本文来自博客园,作者:{Justin_Hu},转载请注明原文链接:{https://www.cnblogs.com/gchenghu/}
分类:
java成长日记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?