PriorityQueue是队列的一种,它叫做优先队列,该类实现了Queue接口。

之所以叫做优先队列,是因为PriorityQueue实现了Comparator这个比较接口,也就是PriorityQueue内部具有了排序方法,在offer(插入)或poll(弹出)元素的过程中,优先队列中的数据会动态排序(而非显式的调用排序方法,可能初学者会这么认为)。

如果不提供Comparator的话,PriorityQueue会按默认的执行,即按照自然数排列,数字最小的优先权最高,对于字符串来说,则是按照字典序。

优先队列不同于常规的队列,对于常规队列来说,每次从队尾入队,队首出队;而对于优先权队列来说,每次出队则是优先权最高的元素。

下面呢,让我们以一个具体案例来更深入的理解PriorityQueue的用法。

 public static void main(String[] args) {
// TODO Auto-generated method stub
Queue<Integer> queue=new PriorityQueue<Integer>(10,new Comparator<Integer>() { @Override
public int compare(Integer i, Integer j) {
// TODO Auto-generated method stub
//注意理解,这里是奇数在左侧,数字大的在左侧
int result=i%2-j%2;
if(result==0)
result=i-j;
return result;
}
});
for(int i=0;i<10;i++)
{
queue.offer(i);
}
for(int i=0;i<10;i++)
{
System.out.println(queue.poll());
}
}

上述代码实现了一个比较器,该比较器设置为奇数在偶数的左侧,大数在小数的左侧。故输出结果为:0 2 4 6 8 1 3 5 7 9

如果,把比较器的参数i和j互换一下,那么,亲们,能猜测到结果吗?

参数互换以后,奇数在偶数的右侧,大数在小数的右侧(注意,个人感觉右侧的优先权最高,即右侧即为队首,勿喷~);

public static void main(String[] args) {
// TODO Auto-generated method stub
Queue<Integer> queue=new PriorityQueue<Integer>(10,new Comparator<Integer>() { @Override
public int compare(Integer j, Integer i) {
// TODO Auto-generated method stub
int result=i%2-j%2;
if(result==0)
result=i-j;
return result;
}
});
for(int i=0;i<10;i++)
{
queue.offer(i);
}
for(int i=0;i<10;i++)
{
System.out.println(queue.poll());
}
}

打印结果为 9 7 5 3 1 8 6 4 2 0

PriorityQueue优先队列用法入门的更多相关文章

  1. 堆结构的优秀实现类----PriorityQueue优先队列

    之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...

  2. 精通awk系列(4):awk用法入门

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk用法入门 awk 'awk_program' a.txt awk示例: # 输出a.txt中的每一行 awk '{print $0 ...

  3. [转帖]PG语法解剖--基本sql语句用法入门

    PG语法解剖--基本sql语句用法入门 https://www.toutiao.com/i6710897833953722894/ COPY 命令挺好的 需要学习一下. 原创 波波说运维 2019-0 ...

  4. 基于PriorityQueue(优先队列)解决TOP-K问题

    TOP-K问题是面试高频题目,即在海量数据中找出最大(或最小的前k个数据),隐含条件就是内存不够容纳所有数据,所以把数据一次性读入内存,排序,再取前k条结果是不现实的. 下面我们用简单的Java8代码 ...

  5. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  6. Go之Logrus用法入门

    Go之Logrus用法入门 Logrus是Go (golang)的结构化日志程序,完全兼容标准库的API日志程序. Logrus is a structured logger for Go (gola ...

  7. Java学习笔记--PriorityQueue(优先队列)(堆)

    PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...

  8. AWK用法入门详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  9. MongoDB 用法入门(windows)①

    概述 大家对数据库肯定不陌生,肯定也有很多人用过MySQL,但是在用MySQL的时候各种建表,写表之间的关联让人非常头疼. MongoDB也是一种数据库,但是它不是用表,而是用集合来装数据的,我对这种 ...

随机推荐

  1. VBS 获取当前进程 ID

    Function CurrProcessId Dim oShell, sCmd, oWMI, oChldPrcs, oCols, lOut lOut = Set oShell = CreateObje ...

  2. C#遍历指定文件夹中的所有文件和子文件夹

    参考:http://www.cnblogs.com/skylaugh/archive/2012/09/23/2698850.html DirectoryInfo TheFolder=new Direc ...

  3. struts2中web.xml的配置

    在web.xml</web-app>前添加的<filter></filter>和<filter-mapping></filter-mapping& ...

  4. D3树状图异步按需加载数据

    D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...

  5. Spring Security 3整合CAS 实现SSO

    spring security 3整合cas client用于实现各Application之间的单点登录. 1. 需要准备的jar spring-security-core-3.0.8.RELEASE ...

  6. Oracle 违反协议 OALL8 处于不一致状态

    http://blog.sina.com.cn/s/blog_a45aac720100yu3h.html ERROR-util.JDBCExceptionReporter>: 违反协议ERROR ...

  7. (C++) System return error codes.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx

  8. 家里蹲大学数学杂志 Charleton University Mathematics Journal 官方目录[共七卷493期,6055页]

    家里蹲大学数学杂志[官方网站]从由赣南师范大学张祖锦老师于2010年创刊;每年一卷, 自己有空则出版, 没空则搁置, 所以一卷有多期.本杂志至2016年12月31日共7卷493期, 6055页.既然做 ...

  9. 在Ubuntu下进行MongoDB安装步骤

    一. 在Ubuntu下最傻瓜的步骤(以下都在root用户下进行操作): 1.运行"apt-get install mongo" 如果遇到找不到安装包的话运行"apt-ge ...

  10. #define中 #与##用法

    参考自: http://zjf30366.blog.163.com/blog/static/411164582009061075923/ #include<cstdio> #include ...