Java优先队列(PriorityQueue)实现重写比较操作

  介绍

这篇文章将为大家详细讲解有关Java优先队列(PriorityQueue)实现重写比较操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

包myapp.kit.quickstart.utils;
  
  进口java.util.Comparator;
  进口java.util.Queue;/* *
  *优先队列(堆)演示。
  *
  * @author huangdingsheng
  1.0 * @version, 2020/5/8
  */公开课PriorityQueue {
  
  公共静态void main (String [] args) {//最小堆、流程自定义数据结构
  QueueminHeap=new java.util.PriorityQueue<祝辞(新的Comparator () {
  @Override
  公共int比较(节点o1,节点o2) {
  返回o1群。v - o2.v;
  }
  });//做某事…
  minHeap。添加(新节点(1、2));
  minHeap。添加(新节点(2、9));
  }//自定义数据结构
  静态类节点{
  int k;
  int v;
  公共节点(int, int v) {
  这一点。k=k;
  这一点。v=v;
  }
  }
  }

<强> Java中PriorityQueue的排序,堆排序

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

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

进口java.util.PriorityQueue;
  公开课PriorityQueueTest3
  {
  公共静态void main (String [] args)
  {
  PriorityQueue PriorityQueue pq=new ();
  pq.offer (6);
  pq.offer (3);
  pq.offer (0);
  pq.offer (9);
  System.out.println (pq);
  }
  }

输出结果:[3、6 0 9]

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

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

进口java.util.PriorityQueue;
  公开课PriorityQueueTest3
  {
  公共静态void main (String [] args)
  {
  PriorityQueue PriorityQueue pq=new ();
  pq.offer (6);
  pq.offer (3);
  pq.offer (0);
  pq.offer (9);
  int len=pq.size();//这里之所以取出.size()大小,因为每一次的民意调查()之后尺寸大小都会变化,所以不能作为为循环的判断条件
  (int i=0; i 

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

关于Java优先队列(PriorityQueue)实现重写比较操作就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

Java优先队列(PriorityQueue)实现重写比较操作