当前位置: 首页 > news >正文

java优先级队列PriorityQueue

文章目录

  • 说明
  • 分享
  • PriorityQueue
    • 升序实现
    • 降序实现
    • 自定义优先级
  • 总结

说明

队列是java高级开发中常用开发技术,普通队列弹出顺序默认FIFO(先进先出)
优先级队列可以默认或指定算法,自动约束数据弹出顺序,本文记录jdk自带非线程安全优先级队列PriorityQueue。
PriorityBlockingQueue 优先级队列线程安全。

分享

  • 大数据博客列表
  • 开发记录汇总
  • 个人java工具库 项目https://gitee.com/wangzonghui/object-tool
    • 包含json、string、集合、excel、zip压缩、pdf、bytes、http等多种工具,欢迎使用。

PriorityQueue

  • 排序默认升序
    • 数字从0增加
    • 字符排序规则按照ASCII码,即字符0到9 > 大写字符A到Z > 小写字符a到z 如果字符串首字符一样则依次比较后面的字符判断优先级。

升序实现

import java.util.PriorityQueue;
import java.util.Queue;

public class MainTest {
public static void main(String[] args) {   
        Queue<Integer> p = new PriorityQueue<>();
        p.offer(1);
        p.offer(2);
        p.offer(5);
        p.offer(4);
        p.offer(3);

        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
   }
}
//输出 1 、2、3、4、5

降序实现

import java.util.PriorityQueue;
import java.util.Queue;

public class MainTest {
public static void main(String[] args) {   
        Queue<Integer> p = new PriorityQueue<>(Collections.reverseOrder());
        p.offer(1);
        p.offer(2);
        p.offer(5);
        p.offer(4);
        p.offer(3);

        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
   }
}
//输出 5、4、3、2、1

自定义优先级

  • 创建学生实体,以平均分为条件,分数越大,优先级越高。
import java.util.List;

/**
 * 学生类
 */
public class Student  {

    //姓名
    public String name;
    //各科分数
    public List<Integer> score;

    public Student (String name ,List<Integer> score){
        this.name=name;
        this.score=score;
    }

    public Student (){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Integer> getScore() {
        return score;
    }

    public void setScore(List<Integer> score) {
        this.score = score;
    }

    public int getAvg(){
      return score.stream().reduce(0, Integer::sum)/score.size();
    }

    @Override
    public String toString() {
        return "name:"+name+",score:"+score+",平均分:"+getAvg();
    }
}
  • 实现类
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Arrays;

public class MainTest {
public static void main(String[] args) {   
      Student student1 = new Student("小明", Arrays.asList(77, 78, 90));
      Student student2 = new Student("小王", Arrays.asList(88, 65, 81));
      Student student3 = new Student("小红", Arrays.asList(92, 78, 90));
      Student student4 = new Student("小李", Arrays.asList(44, 98, 88));

      Queue<Student> q = new PriorityQueue<>((a, b) -> {
          //计算每个学生分数的平均分,降序排序(即平均分越高优先级越高,越先出队列)
          return b.getAvg() - a.getAvg();
      });

      q.offer(student1);
      q.offer(student2);
      q.offer(student3);
      q.offer(student4);

      System.out.println(q.poll().toString());
      System.out.println(q.poll().toString());
      System.out.println(q.poll().toString());
      System.out.println(q.poll().toString());
    }
}
  • 输出结果:
name:小红,score:[92, 78, 90],平均分:86
name:小明,score:[77, 78, 90],平均分:81
name:小王,score:[88, 65, 81],平均分:78
name:小李,score:[44, 98, 88],平均分:76

总结

  • 排序队列是队列中重要的一部分,常应用于不同优先级功能的开发。
  • 好好学习,加油!!

相关文章:

  • 537、RabbitMQ详细入门教程系列 -【消费者Consumer(一)】 2022.08.31
  • wxpython分页
  • Java输入/输出之RandomAccessFile的功能和用法
  • RNNGNULSTM与PyTorch
  • Python升级之路( Lv15 ) 并发编程三剑客: 进程, 线程与协程
  • 南大通用GBase 8a MPP Cluster开发接口简介
  • IntelliJ IDEA 插件推荐
  • Rt-Thread 启动流程与组件初始化
  • CentOS-7-x86_64 iso镜像的安装(Linux操作系统)
  • Parcel配置public静态文件目录
  • 设计模式——策略模式
  • “一万字”动静图生动结合详解:快速排序
  • Linux命令详解(14)useradd命令
  • 面试题之Java的异常
  • k8s helm Seata1.5.1
  • 10个确保微服务与容器安全的最佳实践
  • Asm.js的简单介绍
  • E-HPC支持多队列管理和自动伸缩
  • ES6系列(二)变量的解构赋值
  • HTTP--网络协议分层,http历史(二)
  • NSTimer学习笔记
  • Web设计流程优化:网页效果图设计新思路
  • 那些年我们用过的显示性能指标
  • 使用API自动生成工具优化前端工作流
  • No resource identifier found for attribute,RxJava之zip操作符
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云服务器如何修改远程端口?
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 计算机视觉入门
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #1015 : KMP算法
  • (java)关于Thread的挂起和恢复
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转) Android中ViewStub组件使用
  • (转载)从 Java 代码到 Java 堆
  • *** 2003
  • ***检测工具之RKHunter AIDE
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET NPOI导出Excel详解
  • .Net Web项目创建比较不错的参考文章
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • /var/spool/postfix/maildrop 下有大量文件
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [100天算法】-实现 strStr()(day 52)
  • [2016.7 day.5] T2
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AIGC] MySQL存储引擎详解