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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm缩进快捷方法「建议收藏」

    pycharm缩进快捷方法「建议收藏」整体缩进:鼠标拉选住代码块,按下tab键。反向缩进:鼠标拉选住代码块,按下shift+tab键

    2025年8月4日
    2
  • html自动增加vbs代码,vbs烟花代码

    比如关机代码.和一些常用代码首先在电脑鼠标右键新建一个文本文档。然后点开文本文档进行编辑,最重要的一个代码就是msgbox,然后在后面添加想要说的话,但是要使用英文标点符号,换行时候都需要在前面加上代码,最后保存。我不要整人什么的,我要的是类似翻译的,还有句型哈哈,LS的比较搞笑先说VBS:我是学VB的,据说VB和VBS差不了多少,只是VBS没有主界面而已,VB对网络的支持堪称完美,所以不…

    2022年4月7日
    82
  • 学计算机编程应该先学什么,如何自学计算机编程,学编程应该先学什么

    学计算机编程应该先学什么,如何自学计算机编程,学编程应该先学什么我以前学过但后来放弃了我可以给你点建议希望对你有用!!1.编程一般来说还是先学C语言,其实你不学C直接学C++也行,因为在C++中也包含很多C语。。但是我还是建议先学c.虽然要多花点时间但是对你以后过渡到C++和理解一些编程的基础知识,基本概念是很有好处的。学好了C之后就可以选择学java,c++,C#等。。。虽然语言多,但是他们都基于C只是有些地方不同,你可以根据你的就业方向选择一门学精,一…

    2022年6月16日
    57
  • C# 多线程编程 ThreadStart ParameterizedThreadStart

    C# 多线程编程 ThreadStart ParameterizedThreadStart在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运行的方法。在.net中提供了两种启动线程的方式,一种是不带参数的启动方式,另一种是带参数的启动的方式。    不带参数的启动方式    如果启动参数时无需其它额外的信息,可以使用ThreadStart来实例化Thread,如下面的代码:1usingSystem;

    2022年7月15日
    13
  • 常见的几种矩阵分解方式

    常见的几种矩阵分解方式1.三角分解(LU分解)矩阵的LU分解是将一个矩阵分解为一个下三角矩阵与上三角矩阵的乘积。本质上,LU分解是高斯消元的一种表达方式。首先,对矩阵A通过初等行变换将其变为一个上三角矩阵。对于学习过线性代数的同学来说,这个过程应该很熟悉,线性代数考试中求行列式求逆一般都是通过这种方式来求解。然后,将原始矩阵A变为上三角矩阵的过程,对应的变换矩阵为一个下三角矩阵。这中间的过程,就是Doolittleal

    2022年5月30日
    43
  • bigdecimal保留小数位数_如何保留两位小数

    bigdecimal保留小数位数_如何保留两位小数packagecom.algorithms;importjava.math.BigDecimal;importjava.util.Scanner;/***调和级数求和*@authorLYY**/publicclassTiaoHeJiShuTest{publicstaticvoidmain(String[]args){System

    2025年12月9日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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