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


相关推荐

  • jenkins教程_1 简介「建议收藏」

    jenkins教程_1 简介「建议收藏」文章内容https://gitee.com/fakerlove/jenkins文章目录1.简介1.1介绍1.2环境准备1.2.1安装jenkins1)离线安装2)docker安装3)访问jenkins1.2.2安装gitlab一、安装及配置1.gitlab镜像拉取2.运行gitlab镜像3.配置4.创建一个项目二、用户使用1.下载git.exe2.登录gitlab网页3.设置ssh4.从gitlab克隆代码5.提交代码到gitlab1.2.3gitlab占用内存太多问题1.简.

    2022年5月15日
    37
  • 罗技k380无线键盘怎么连接电脑_罗技k480切换输入法

    罗技k380无线键盘怎么连接电脑_罗技k480切换输入法一、核实蓝牙键盘是否开启:蓝牙键盘有单独的开关,若蓝牙键盘没有打开,则无法使用。开启方法:键盘开机键在键盘的左侧位置,将开关向左移动到ON即可开启,二、核实蓝牙键盘是否有电:蓝牙键盘是需要单独充电的设备,若蓝牙键盘没有电,则无法使用。充电方法:在键盘左侧位置有充电端口,将充电器连接到此端口即可为键盘充电注:键盘充电时,电源指示灯会变为红色,充电完毕后,电源指示灯会变为蓝色。三、将键盘与平板电脑重新…

    2022年10月15日
    2
  • 现货黄金贵金属投资入门基础知识

    现货黄金贵金属投资入门基础知识现货黄金贵金属投资入门知识:  很多中小投资者对证券投资都比较熟悉,但对现货黄金贵金属投资还不是很熟悉。现货吧给大家做一些简单的介绍。希望能为大家进入现货黄金贵金属投资的市场提供一些有益的参考和帮助。  现货黄金.jpg  黄金贵金属投资分为实物黄金和合约式黄金,投资实物黄金的可靠性较强,但买卖过程比较麻烦,而且还要自己承担保管的成本和风险,投资起来明显不如合约

    2022年5月8日
    26
  • php date()函数不支持处理大于2147483648的数字?「建议收藏」

    php date()函数不支持处理大于2147483648的数字?

    2022年2月20日
    55
  • 公共开放WebService接口

    公共开放WebService接口公共开放WebService接口快递查询WEB服务 http://webservice.36wu.com/ExpressService.asmx支持上百家快递/物流查询,准确高效,所有数据均来自快递服务商。此数据返回类型进行了封装,方便开发人员和应用者进行调用,后期会提供返回json类型,敬请关注。支持的快递/物流天气预报WEB服务 ht

    2022年7月16日
    26
  • quotename()函数 

    quotename()函数 请教quotename函数的理解,我已经看了很多帮助,储如以下示例 QUOTENAME(Transact-SQL)返回带有分隔符的Unicode字符串,分隔符的加入可使输入的字符串成为有效的MicrosoftSQLServer2005分隔标识符。Transact-SQL语法约定语法QUOTENAME(‘character_string'[,’q…

    2022年7月25日
    9

发表回复

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

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