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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQL | 窗口函数 row number + partition by 排序

    SQL | 窗口函数 row number + partition by 排序目录1  背景2  SQL牛逼函数走起来2.1  Step12.2  SQL实现12.3  Step22.4  SQL实现22.5  补充-collect函数2.5.1  SQL语句3  头条面试SQL题3.1&nbs…

    2022年5月29日
    45
  • Centos7安装Mysql5.7最全教程[通俗易懂]

    Centos7安装Mysql5.7最全教程[通俗易懂]最近需要在Linux系统上使用MySQL,记录一下安装过程吧,为后来的同学排除一些问题。更新yumyumupdate-y1.安装wget工具我安装到了/export/install这里可以进入你们所想要安装的地方cd/先进入你想安装的位置,此后全部在此文件夹进行操作。sudoyuminstall-ywget2.使用wget下载mysqlyum源:wgethttps://dev.mysql.com/get/mysql80-community-release-el

    2022年5月2日
    87
  • BN层论文总结[通俗易懂]

    BN层论文总结[通俗易懂]论文:BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShiftMotivation题目中的InternalCovariateShift指的是在训练过程中各层输入数据的分布随前一层网络参数的变化而变化的现象,这种现象会使训练深度神经网络变得更加复杂,需要耗费更多的时…

    2022年10月14日
    4
  • 输入网址访问服务器详细流程

    输入网址访问服务器详细流程问题:以前遇到过一次输入一个网站打不开,该网站服务器没问题,换台电脑可以打开。这台电脑可以打开别的网站,就是打不开我要访问的网站。后来找到C:\Windows\System32\drivers\etc\hosts 这个文件,在该文件中找到该网址删掉就好了. 答案:   输入网址访问的时候,浏览器会进行解析域名,找对应的ip地址。那么首先就从本机C:\Windows\System…

    2022年6月16日
    34
  • 软件构架师的特点

    软件构架师的特点

    2021年7月31日
    60
  • openssl生成证书linux,Linux下使用openssl生成证书「建议收藏」

    openssl生成证书linux,Linux下使用openssl生成证书「建议收藏」利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件.证书文件的生成步骤:一、服务器端1.生成服务器端的私钥(key文件);opensslgenrsa-des3-outserver.key1024运行时会提示输入密码,此密码用于加密key文件(参数des3是加密算法…

    2022年9月19日
    3

发表回复

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

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