Java优先级队列PriorityQueue「建议收藏」

Java优先级队列PriorityQueue「建议收藏」目录普通队列对比优先级队列:逆序优先级队列自定义优先级队列的优先级相较于普通先进先出队列来说,优先级队列会根据优先级进行由高到低排序,出队时优先级高的先出队。普通队列对比优先级队列:1.普通队列:importjava.util.LinkedList;importjava.util.Queue;publicclassMainTest{publicstaticvoidmain(String[]args){ Queue<Integer>queue

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

相较于普通先进先出队列来说,优先级队列会根据优先级进行由高到低排序,出队时优先级高的先出队。

普通队列对比优先级队列:

1.普通队列:

import java.util.LinkedList;
import java.util.Queue;

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

        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
	}
}

输出:

0
2
5
3
6
1
4
0

2.优先级队列:

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

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

        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());
        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
   }
}

输出:

0
0
1
2
3
4
5
6

总结:
1.普通优先级队列先进先出。优先级队列会根据优先级进行排序,优先级高的先出队;
2.对于数字类型的优先级队列,默认数字越小优先级越高;
3.对于字符串类型的优先级对列,默认安照ASCII码位置,位置越小优先级越高,即优先级:字符0到9 >大写字符A到Z > 小写字符a到z 如果字符串首字符一样则依次比较后面的字符判断优先级。

逆序优先级队列

默认的数字类型优先级队列数字越小优先级越高,字符串类型的优先级对列ASCII码位置越小优先级越高。有时候我们需要数字越大优先级越高或者ASCII码位置越大优先级越高,所以需要改变默认的优先级。

逆序优先级队列:

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(0);
        p.offer(2);
        p.offer(5);
        p.offer(3);
        p.offer(6);
        p.offer(1);
        p.offer(4);
        p.offer(0);

        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());
        System.out.println(p.poll());
        System.out.println(p.poll());
        System.out.println(p.poll());
   }
}

输出:

6
5
4
3
2
1
0
0

自定义优先级队列的优先级

优先级队列里根据每个学生的平均分降序排序,即平均分越高优先级越高,越先出队列

学生类Student:

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;
    }

    @Override
    public String toString() { 
   
        int avg= score.stream().reduce(0, Integer::sum)/score.size();
        return "name:"+name+",score:"+score+",平均分:"+avg;
    }
}

测试:

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

public class MainTest { 
   
public static void main(String[] args) { 
      
        Student student1 = new Student("小明", Arrays.asList(77, 56, 98));
        Student student2 = new Student("小王", Arrays.asList(95, 62, 80));
        Student student3 = new Student("小红", Arrays.asList(82, 69, 73));
        Student student4 = new Student("小刘", Arrays.asList(90, 86, 74));

        Queue<Student> q = new PriorityQueue<>((a, b) -> { 
   
            //计算每个学生分数的平均分,降序排序(即平均分越高优先级越高,越先出队列)
            List<Integer> lisaA = a.getScore();
            List<Integer> lisaB = b.getScore();
            int avgA = lisaA.stream().reduce(0, Integer::sum) / lisaA.size();
            int avgB = lisaB.stream().reduce(0, Integer::sum) / lisaB.size();
            return avgB - avgA;
        });

        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:[90, 86, 74],平均分:83
name:小王,score:[95, 62, 80],平均分:79
name:小明,score:[77, 56, 98],平均分:77
name:小红,score:[82, 69, 73],平均分:74

参考:Priority Queue in Reverse Order in Java

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190203.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 集成电路芯片半导体中英文对照术语词汇表「建议收藏」

    集成电路芯片半导体中英文对照术语词汇表「建议收藏」英语 中文 1-9   10gigabit 10Gb 1stNyquistzone 第一奈奎斯特区域 3Dfull‑waveelectromagneticsolver 3D全波电磁解算器 3-state 三态 4thgenerationsegmentedrouting 第四代分层布线技术 5Gcommercialization 5G商用 7seriesFPGA 7系列FPG

  • log4cpp学习

    log4cpp学习1、linux下log4cpp的下载安装配置http://log4cpp.sourceforge.net/官方网站有下载地址,安装过程配置选项及测试用例。将下载好的tar包解压到/usr/local/下运行./configure(如有需要添加相关配置选项),使用make编译,使用makecheck进行检测,使用makeinstall安装,使用之前的相关命令安装好之后在/usr

  • Linux 常用的zip压缩和解压命令详解

    Linux 常用的zip压缩和解压命令详解前言  嗨,大家好,又与大家见面了,感谢大家在2021年的陪伴,让我们在2022年继续一路前行。相信很多小伙伴在使用Linux系统中经常对文件进行或者文件夹进行操作,不像在Windows中可以使用可视化的工具对文件和文件夹进行压缩和解压操作,那么本次与大家一起学习Linux下zip和unzip的压缩和解压命令,并熟悉常用的参数介绍。常用命令  相信很多对于有一定Linux基础的小伙伴,常用的压缩有:zip、unzip、tar、gzip、bzip2等常用的命令,下面开始zip和unzip使用方法和参数详

  • Java中BufferedWriter类的常用方法

    Java中BufferedWriter类的常用方法BufferedWriter:字符缓冲输出流构造方法BufferedWriter(Writerout):默认缓冲区大小构造字符缓冲输出流对象BufferedWriter(Writerout,intsize):指定缓冲区大小常用方法publicvoidwrite(intc)throwsIOException写入单个字符。c-指定要写入字符的int。publicvoidwr…

  • java命令不是内部或外部命令_运行cmd不是内部或外部命令

    java命令不是内部或外部命令_运行cmd不是内部或外部命令‘javah’不是内部或外部命令,也不是可运行的程序或批处理文件。在生成Java头文件时报错,经查询发现新版的Java不使用javah的命令了,而是使用javac-h用法:javac–h<directory><sourcefiles>将路径cd到需要生成头文件的文件夹后,输入命令:javac-h./Java2cpp.java即可生成头文件。其中,“-h./”表示头文件生成到当前目录。…

  • MySQL的HAVING用法「建议收藏」

    MySQL的HAVING用法「建议收藏」来自:https://blog.lmlyz.online/index/detail/id/59.htmlwhere、聚合函数、having在from后面的执行顺序:where>聚合函数(sum,min,max,avg,count)>having若须引入聚合函数来对groupby结果进行过滤则只能用having。(是先执行聚合函数还是先过滤然后比对我上面列出的执行顺序…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号