Java优先队列的创建与使用详解

 更新时间:2024年08月01日 09:21:44   作者:蒲公英的岁月  
这篇文章主要介绍了Java优先队列的创建与使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java优先队列的创建与使用

最近刷到了力扣的第347题.前K个高频元素,由于之前一直用C++刷题,对于Java的语法还有些生疏,这道题目需要使用优先队列解题,一下子不知道怎么创建了。

首先在Java中优先队列是由PriorityQueue实现Queue的接口,可以对队列中的元素按照大小顺序进行排序,对于队列中的元素,可以是基本数据类型的包装类,也可以是自定义的类。

1.基本数据类型作为队列元素

我们以Integer,整数类型的包装类为例,构造一个优先队列

Queue<Integer>que = new PriorityQueue<>();
que.add(2);
que.add(1);
que.add(3);
//在这种默认的构造方式下,队列中的元素是从小到大排序的
//队列中元素顺序依次为1,2,3

如果要构造最大优先队列,可以使用lambda表达式

代码如下所示:

//注意这里return x1-x2为最小优先队列,x2-x1为最大优先队列
Queue<Integer>que = new PriorityQueue<>((x1,x2)->{return x2-x1;});
que.add(2);
que.add(1);
que.add(3);
//此时队列中的元素依次为3,2,1

2.自定义数据类型作为队列元素

假设我们需要使用Map<Integer,Integer>来对出现过的整数统计出现过的次数,即按照Map的值进行排序,应该如何做呢?

看如下代码:

Map<Integer,Integer>map = new HashMap<>();
//....整数出现次数进行统计,假设已经全部统计进入map中
//用一个集合来获取map中的所有键值对
Set<Map.Entry<Integer,Integer>> set = map.entrySet();
//创建优先队列 同样使用lambda表达式,getValue()函数用于获取map中的值
//x1-x2即按照升序,是最小优先队列
Queue<Map.Entry<Integer,Integer>>que = new PriorityQueue<>((x1,x2)->{return x1.getValue()-x2.getValue();})
//再把Set中的键值对加入que中 则元素按照值的升序排列在队列que中
for(Map.Entry<Integer,Integer> en:set){
que.add(en); //或que.offer(en);
}

使用Map<Integer,Integer>类型创建优先队列的过程如上所示,如果是一些自定义的类,比如学生的学号,年龄,进行排序,同样可以这样操作,关于PriorityQueue的方法可以查看java api手册

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot Nacos实现自动刷新

    SpringBoot Nacos实现自动刷新

    这篇文章主要介绍了SpringBoot Nacos实现自动刷新,Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台
    2023-01-01
  • MyBatis与Hibernate的比较

    MyBatis与Hibernate的比较

    Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2
    2016-01-01
  • jdk中密钥和证书管理工具keytool常用命令详解

    jdk中密钥和证书管理工具keytool常用命令详解

    keytool JAVA是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务
    2014-01-01
  • 关于Java单个TCP(Socket)连接发送多个文件的问题

    关于Java单个TCP(Socket)连接发送多个文件的问题

    这篇文章主要介绍了关于Java单个TCP(Socket)连接发送多个文件的问题,每次我只能使用一个 Socket 发送一个文件,没有办法做到连续发送文件,本文来解决这个问题,需要的朋友可以参考下
    2023-04-04
  • Java中遍历集合的并发修改异常解决方案实例代码

    Java中遍历集合的并发修改异常解决方案实例代码

    当你遍历集合的同时,又往集合中添加或者删除元素,就可能报并发修改异常,下面这篇文章主要给大家介绍了关于Java中遍历集合的并发修改异常解决方案的相关资料,需要的朋友可以参考下
    2022-12-12
  • Spring Security 安全框架应用原理解析

    Spring Security 安全框架应用原理解析

    这篇文章主要介绍了Spring Security 安全框架应用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页详解

    SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页详解

    这篇文章主要介绍了SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页详解,需要的朋友可以参考下
    2020-02-02
  • Java中的snowflake算法详解

    Java中的snowflake算法详解

    这篇文章主要介绍了Java中的snowflake算法详解,Snowflake算法产生是为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序,并且在分布式系统中不同机器产生的id必须不同,需要的朋友可以参考下
    2023-08-08
  • Java 文创商城系统的实现流程

    Java 文创商城系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+mysql+maven+tomcat实现一个文创商城系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • JAVA多线程线程安全性基础

    JAVA多线程线程安全性基础

    这篇文章主要介绍了如何测试Java类的线程安全性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08

最新评论