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. cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台

    目录 [TOC] 1.基本概念 ​ 既然是对Docker的容器进行监控,我们就不自己单独搭建cAdvisor.InfluxDB.Grarana了,本文中这三个实例,主要以Docker容器方式运行. 本 ...

  2. java 线程安全 synchronized

    一.线程安全问题: 并发编程的原则:设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性(数据准确)问题,如果并发程序连最基本的执行结果准确性都无法保证,那并发编程就没有任何意义. ...

  3. Javascript模式(第三章字面量与构造函数)------读书笔记

    一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...

  4. [2014.01.27]WFsoft.wfWebCtrl.wfPage 5.9

    wfPage多功能.Net翻页组件,使用简单,功能强大. 提供"首页","上一页","下一页","末页","转 ...

  5. flex 布局 初次接触这个好使又不是特别好用的布局方法

    刚开始学前端的童鞋们应该也是一样先学习的table然后再学习了盒子模型,感觉终于学会了简单的网页布局,使用各种display,float,position绞尽脑汁给页面布局成自己想要的页面样式,然而, ...

  6. Java lamda Stream

    Intermediate:一个流可以后面跟随零个或多个 intermediate 操作.其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用.这类操作都是惰性化的( ...

  7. Spark之SQL解析(源码阅读十)

    如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...

  8. 安装中文版cacti监控华为交换机流量并实现95计费

    摘要:一. 装置yum源: 以网易yum源为例 1. 下载repo文件 下载地点:http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.备份并调换体 ...

  9. 样式hack

    1.CSS 重置 html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, ...

  10. <2016-1-29>

    1.打电话,发短信,发邮件 //打电话 <script> function call(){ var call = new CallManage(); call.call('10086'); ...