ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA 中 类型是 Map 的 PriorityQueue 3种写法

2022-07-20 23:32:17  阅读:185  来源: 互联网

标签:Map JAVA priorityQueue getValue PriorityQueue new 写法


JAVA 中 类型是 Map 的 PriorityQueue 3种写法

刷题的时候发现不是很熟悉JAVA 里的 heap(堆) 即 PriorityQueue 的用法,记录一下 PriorityQueue<Map.Entry<>> 的基本用法:

写法一,直接 new 一个Comparator:

PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(
        new Comparator<Map.Entry<Integer, Integer>>() {
            public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
                return e1.getValue() - e2.getValue();
            }
        });

写法二, 对写法一 优化:

PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(
        (e1, e2) -> e1.getValue() - e2.getValue());

写法三, 再优化

PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(Map.Entry::getValue));

写法3 是JAVA 8 里面最好的写法, 可以直接调用 comparator 里面的静态方法 comparingInt, 当然如果比较类型不是Int 而是String的话也可以调用相应的其他方法。

这里的写法最终得到的 priorityQueue 都是最小堆, 如果需要使用最大堆的话,在前两种写法里面要用e2.getValue()-e1.getValue().

当然,如果简单的想要直接用普通数据类型,比如 int 或者 String 类型的 priorityQueue 的最大堆, 也可以通过new 一个新的 Comparator 来完成。

附: PriorityQueue 的基本方法:

创建对象:

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

插入:

priorityQueue.add(1);

或者

priorityQueue.offer();

在源码里,PriorityQueue 的add() 方法直接调用了offer() 方法,返回类型都是 boolean。

查看堆顶元素,返回堆顶元素但不删除

priorityQueue.peek();

或者

priorityQueue.element();

删除堆顶元素并返回:

priorityQueue.remove();

或者

priorityQueue.poll();

当然,PriorityQueue 还可以 删除特定元素,返回值是boolean

priorityQueue.remove(1);

标签:Map,JAVA,priorityQueue,getValue,PriorityQueue,new,写法
来源: https://www.cnblogs.com/ElloeStudy/p/16500289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有