开发者

Java优先队列的创建与使用详解

php
  • Java优先队列的创建与使用
    • 1.基本数据类型作为队列元素
    • 2.自定义数据类型作为队列元素
  • 总结

    Java优先队列的创建与使用

    最近刷到了力扣的第347题.前K个高频元素,由于之前一直用C++刷题,对于Java的语法还有些生疏,这道题目需要使用优先队列解题,一下子不知道怎么创建了。

    首先在Java中优先队列是由PriorityQueue实现Queue的接口,可以对队列中的元素按照大小顺序进行排序,对于队列中的元素,可以是基本数据类型的包装类,也可以是自定义的类。

    1.基本数据类型作为队列元素

    我们以Integer,整数类型的包装类为例,构造一个优先队列

    Queue<Integer>que = new PriorityQueue<>();
    que.add(2);
    que.add(1);
    que.add(3);
    //在这种默认的构造方式下,队列中的元素是从小到大排序的
    //队列中元素顺序依次为1,2,3

    如果要构造最大优先队列,可以使用lambda表达式

    代码如下所示:

    //注意这里return x1-x2为最小优先队列,x2-x1为最大优先队列
    Queue<Integer>que = new PriorityQueue<>((x1,x2)->{return x2-x1;});
    que.add(2);
    que.add(1);
    que.adjavascriptd(3);
    //此时队列中的元素依次为3,2,1

    2.自定义数据类型作为队列元素

    假设我们需要使用Map<Integer,Integer>来对出现过的整数统计出现过的次数,即按照Map的值进行排序,应该如何做呢?

    看如下代码:

    Map<Integer,Integer>map = new HashMap<>();
    //....整数出现次数进行统计,假设已经全部统计进入map中
    //用一个集合来获取map中的所有键值对
    Sewww.devze.comt<Map.Entry<Integer,Integer>> set = map.entrySet();
    /编程客栈/创建优先队列 同样使用lambda表达式,getValue()函数用于获取map中的值
    //x1-x2即按照升序,是最小优先队列
    Queue<Map.Entry<Integer,Integer>>que = new PriorityQueue<>((x1,x2)->{return x1.getValue()-x2.getValue();})
    //再把Set中的键值对加入que中 则元素按照值的升序排列在队列que中
    for(Map.Entry<Integer,Iwww.devze.comnteger> en:set){
    que.add(en); //或que.offer(en);
    }

    使用Map<Integer,Integer>类型创建优先队列的过程如上所示,如果是一些自定义的类,比如学生的学号,年龄,进行排序,同样可以这样操作,关于PriorityQueue的方法可以查看java api手册

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜