Java的优先队列PriorityQueue原理及实例分析
这篇文章主要介绍了Java的优先队列PriorityQueue原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、优先队列概述
优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序,
可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类
对于基本数据类型的包装器类,优先队列中元素默认排列顺序是升序排列
但对于自己定义的类来说,需要自己定义比较器
二、常用方法
- peek()//返回队首元素
- poll()//返回队首元素,队首元素出队列
- add()//添加元素
- size()//返回队列元素个数
- isEmpty()//判断队列是否为空,为空返回true,不空返回false
三、优先队列的使用
1.队列保存的是基本数据类型的包装类
//自定义比较器,降序排列 staticComparatorcmp=newComparator (){ publicintcompare(Integere1,Integere2){ returne2-e1; } }; publicstaticvoidmain(String[]args){ //不用比较器,默认升序排列 Queue q=newPriorityQueue<>(); q.add(3); q.add(2); q.add(4); while(!q.isEmpty()) { System.out.print(q.poll()+""); } /** *输出结果 *234 */ //使用自定义比较器,降序排列 Queue qq=newPriorityQueue<>(cmp); qq.add(3); qq.add(2); qq.add(4); while(!qq.isEmpty()) { System.out.print(qq.poll()+""); } /** *输出结果 *432 */ }
2.队列保存的是自定义类
//矩形类
classNode{
publicNode(intchang,intkuan)
{
this.chang=chang;
this.kuan=kuan;
}
intchang;
intkuan;
}
publicclassTest{
//自定义比较类,先比较长,长升序排列,若长相等再比较宽,宽降序
staticComparatorcNode=newComparator(){
publicintcompare(Nodeo1,Nodeo2){
if(o1.chang!=o2.chang)
returno1.chang-o2.chang;
else
returno2.kuan-o1.kuan;
}
};
publicstaticvoidmain(String[]args){
Queueq=newPriorityQueue<>(cNode);
Noden1=newNode(1,2);
Noden2=newNode(2,5);
Noden3=newNode(2,3);
Noden4=newNode(1,2);
q.add(n1);
q.add(n2);
q.add(n3);
Noden;
while(!q.isEmpty())
{
n=q.poll();
System.out.println("长:"+n.chang+"宽:"+n.kuan);
}
/**
*输出结果
*长:1宽:2
*长:2宽:5
*长:2宽:3
*/
}
}
3.优先队列遍历
PriorityQueue的iterator()不保证以任何特定顺序遍历队列元素。
若想按特定顺序遍历,先将队列转成数组,然后排序遍历
示例
Queueq=newPriorityQueue<>(cmp); int[]nums={2,5,3,4,1,6}; for(inti:nums) { q.add(i); } Object[]nn=q.toArray(); Arrays.sort(nn); for(inti=nn.length-1;i>=0;i--) System.out.print((int)nn[i]+""); /** *输出结果 *654321 */
4.比较器生降序说明
Comparator
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。