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手册

总结

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

相关文章

  • 基于SSM 集成 Freemarker模板引擎的方法

    基于SSM 集成 Freemarker模板引擎的方法

    这篇文章主要介绍了SSM 集成 Freemarker模板引擎,SSM 架构下一般采用 Freemarker,Spring Boot 架构下一般推荐采用 Thymeleaf 模板引擎,需要的朋友可以参考下
    2022-01-01
  • SpringBoot整合RocketMQ实现发送同步消息

    SpringBoot整合RocketMQ实现发送同步消息

    RocketMQ 是一款开源的分布式消息中间件,由阿里巴巴开源,它具有高可用性、高性能、低延迟等特点,广泛应用于阿里巴巴集团内部以及众多外部企业的业务系统中,本文给大家介绍了SpringBoot整合RocketMQ实现发送同步消息,需要的朋友可以参考下
    2024-04-04
  • 缓存工具类ACache使用方法详解

    缓存工具类ACache使用方法详解

    这篇文章主要为大家详细介绍了缓存工具类ACache的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 详解Spring Boot配置使用Logback进行日志记录的实战

    详解Spring Boot配置使用Logback进行日志记录的实战

    本篇文章主要介绍了详解Spring Boot配置使用Logback进行日志记录的实战,具有一定的参考价值,有兴趣的朋友可以了解一下
    2017-07-07
  • SpringBoot结合Redis实现接口幂等性的示例代码

    SpringBoot结合Redis实现接口幂等性的示例代码

    本文主要介绍了SpringBoot结合Redis实现接口幂等性的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java中比较Long类型是否相等代码示例

    Java中比较Long类型是否相等代码示例

    在Java编程中long是一种数据类型,用于表示整数值,下面这篇文章主要给大家介绍了关于Java中比较Long类型是否相等的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Java Zip文件读写操作详解

    Java Zip文件读写操作详解

    这篇文章主要为大家详细介绍了如何利用Java ZipInputstream、ZipOutputStream实现获取每个文件中的内容与写入内容,感兴趣的可以动手尝试一下
    2022-11-11
  • Java开发推荐使用的JDK版本以及对比详细分析

    Java开发推荐使用的JDK版本以及对比详细分析

    这篇文章详细分析了JDK17和JDK21作为当前推荐版本的优缺点,并对比了它们与JDK8和JDK11的差异,文中介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-04-04
  • springboot+thymeleaf+shiro标签的实例

    springboot+thymeleaf+shiro标签的实例

    这篇文章主要介绍了springboot+thymeleaf+shiro标签的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java 中ThreadLocal 的正确用法

    java 中ThreadLocal 的正确用法

    这篇文章主要介绍了java 中ThreadLocal 的正确用法的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论