【Java基础】一文带你了解java中的PriorityQueue如何使用

134 阅读2分钟

本文重点介绍PriorityQueue的使用,不涉及源码分析,如有误,欢迎在评论区指出!

PriorityQueue即优先队列,从下图可以看出,它实现了Queue,满足FIFO的原则。 但是与普通Queue不同,优先队列元素是按排序顺序检索的。

image.png

创建

普通

当不规定任何优先级,默认情况是,队列的头是队列中最小的元素。元素将按升序从队列中移除。

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

Plus

要想规定优先级,可以借助Comparator接口自定义元素的顺序。 重写compare的方法主要有三种:创建类、匿名内部类、lambda表达式。

这里推荐我自己采用lambda表达式重写,原因是简洁🥲

降序存储:

PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> b-a);

这样写更简洁😎

PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());

如果想要定义更加复杂的优先级关系,可以先写一个自定义比较器,然后作为参数传递给PriorityQueue像这样⬇️

// 按照用户姓名的字典顺序排列 
Comparator<UserInfo> comparator = Comparator.comparing(user -> user.name); 
// 或者按照先按用户年龄升序,年龄相同时按工资降序排列
Comparator<UserInfo> comparator = Comparator 
                .comparingInt((UserInfo user) -> user.age) // 按照年龄升序 
                thenComparingDouble(user -> user.salary, Comparator.reverseOrder()); // 年龄相同按照工资降序


PriorityQueue<UserInfo> pq = new PriorityQueue<>(comparator);

这段代码是gpt写的,我感觉不够标准常用,以后我写题遇到复杂的,学习到常用的,再补充。也欢迎了解的大佬在评论区教教我😀😀

插入元素

  • add() - 将指定的元素插入队列。如果队列已满,则会引发异常。
  • offer() - 将指定的元素插入队列。如果队列已满,则返回false。

删除元素

  • remove() - 从队列中删除指定的元素
  • poll() - 返回并删除队列的开头

访问元素

  • peek() - 返回队列的头部

遍历元素

  • 使用iterator()方法
    Iterator<Integer> iter = pq.iterator();
    while(itere.hasNext()) {
        System.out.print(iter.next());
        System.out.print(", ");
    }

如果本文对你有帮助的话,不妨点个小赞👍帮助更多的小伙伴!!!