Java优先队列(PriorityQueue)重写compare操作

 更新时间:2020年10月08日 09:38:40   作者:微观尽头  
这篇文章主要介绍了Java优先队列(PriorityQueue)重写compare操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

we can custom min heap or max heap by override the method compare.

package myapp.kit.quickstart.utils;
 
import java.util.Comparator;
import java.util.Queue;
 
/**
 * priority queue (heap) demo.
 *
 * @author huangdingsheng
 * @version 1.0, 2020/5/8
 */
public class PriorityQueue { 
 
  public static void main(String[] args) {
 
    // min heap, process custom data struct
    Queue<Node> minHeap = new java.util.PriorityQueue<>(new Comparator<Node>(){
      @Override
      public int compare(Node o1, Node o2) {
        return o1.v - o2.v;
      }
    }); 
 
    // do sth...
    minHeap.add(new Node(1, 2));
    minHeap.add(new Node(2, 9)); 
  }
 
  // custom data struct
  static class Node {
    int k;
    int v;
    public Node(int k, int v) {
      this.k = k;
      this.v = v;
    }
  } 
}

补充知识:Java中PriorityQueue的排序,堆排序

PrioriryQueue是Queue接口的一个队列实现类,但它的排序并不是典型的队列式先进先出(FIFO)的方式。

PriorityQueue的排序方式分为两种,一种是自然排序,这是按照加入元素的大小从小到大排序的。第二种是定制排序,是使用comparator类来重写compare(Object o1,Object o2)方法来实现定制排序的。但是这些都不是关键,关键在于PriorityQueue的排序不是普通的排序,而是堆排序,这有什么不同呢?来看下面一段代码:

import java.util.PriorityQueue;
public class PriorityQueueTest3 
{
 public static void main(String[] args) 
 {
 PriorityQueue pq = new PriorityQueue();
 pq.offer(6);
 pq.offer(-3);
 pq.offer(0);
 pq.offer(9);
 System.out.println(pq);
 }
}

输出结果:[-3,6,0,9]

不是说是按从小到大来排序的吗?怎么没排序?

原因是堆排序只会保证第一个元素也就是根节点的元素是当前优先队列里最小(或者最大)的元素,而且每一次变化之后,比如offer()或者poll()之后,都会进行堆重排,所以如果想要按从小到大的顺序取出元素,那么需要用一个for循环,如下:

import java.util.PriorityQueue;
public class PriorityQueueTest3 
{
 public static void main(String[] args) 
 {
 PriorityQueue pq = new PriorityQueue();
 pq.offer(6);
 pq.offer(-3);
 pq.offer(0);
 pq.offer(9);
 int len = pq.size();//这里之所以取出.size()大小,因为每一次poll()之后size大小都会变化,所以不能作为for循环的判断条件
 for(int i=0;i<len;i++){
  System.out.print(pq.poll()+" ");
 }
 System.out.println();
 }
}

输出 -3 0 6 9,按照从小到大的顺序输出的

以上这篇Java优先队列(PriorityQueue)重写compare操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 注解@PostConstruct的原理及使用场景

    Java 注解@PostConstruct的原理及使用场景

    @PostConstruct 是 Java 中用于标记初始化方法的注解,本文将详细讲解 @PostConstruct 的原理、使用场景及最佳实践,感兴趣的朋友一起看看吧
    2025-04-04
  • Java代码是如何被CPU狂飙起来的

    Java代码是如何被CPU狂飙起来的

    无论是刚刚入门Java的新手还是已经工作了的老司机,恐怕都不容易把Java代码如何一步步被CPU执行起来这个问题完全讲清楚。本文就带你详细了解Java代码到底是怎么运行起来的。感兴趣的同学可以参考阅读
    2023-03-03
  • Spring集成Redis详解代码示例

    Spring集成Redis详解代码示例

    这篇文章主要介绍了Spring集成Redis详解代码示例,介绍了Eclipse工程结构,POM依赖,Spring配置,Redis配置信息以及Java代码等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot整合Druid数据库连接池的方法

    SpringBoot整合Druid数据库连接池的方法

    Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。这篇文章主要介绍了SpringBoot整合Druid数据库连接池的方法,需要的朋友可以参考下
    2020-07-07
  • Java使用反射和动态代理实现一个View注解绑定库

    Java使用反射和动态代理实现一个View注解绑定库

    这篇文章主要介绍了Java使用反射和动态代理实现一个View注解绑定库,代码简洁,使用简单,扩展性强,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • IDEA 隐藏DEBUG日志的解决方法

    IDEA 隐藏DEBUG日志的解决方法

    IDEA 打印太多的DEBUG日志,看起来很烦,有没有办法隐藏日志,网上找了一圈,没有谁写的靠谱的,下面小编给大家分享下IDEA 如何隐藏DEBUG日志,需要的朋友可以参考下
    2022-09-09
  • SpringBoot整合BootStrap实战

    SpringBoot整合BootStrap实战

    这篇文章主要介绍了SpringBoot整合BootStrap实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java使用DateTimeFormatter实现格式化时间

    Java使用DateTimeFormatter实现格式化时间

    这篇文章主要介绍了Java使用DateTimeFormatter实现格式化时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 完美解决idea创建文件时,文件不分级展示的情况

    完美解决idea创建文件时,文件不分级展示的情况

    这篇文章主要介绍了完美解决idea创建文件时,文件不分级展示的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 解决springboot项目找不到resources目录下的资源问题

    解决springboot项目找不到resources目录下的资源问题

    这篇文章主要介绍了解决springboot项目找不到resources目录下的资源问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论