Java中优先队列PriorityQueue常用方法示例

 更新时间:2023年09月23日 10:37:10   作者:little_fat_sheep  
这篇文章主要介绍了Java中优先队列PriorityQueue常用方法示例,PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆),需要的朋友可以参考下

1 前言

PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:

  • 插入元素后,从堆底到堆顶调整堆;
  • 删除元素后,将队尾元素复制到队头,并从堆顶到堆底调整堆。

PriorityQueue采用数组实现,也是一棵完全二叉树,构成堆结构。数组初始大小为11。

Queue框架如下:

Queue框架

2 PriorityQueue常用方法

public boolean add(E e); //在队尾添加元素,并调整堆结构
public E remove(); //在队头删除元素,并返回,再调整堆结构
public E element(); //返回队头元素(不删除)
public boolean isEmpty(); //判断队列是否为空
public int size(); //获取队列中元素个数
public void clear(); //清空队列
public boolean contains(Object o); //判断队列中是否包含指定元素(从队头到队尾遍历)
public Iterator<E> iterator(); //迭代器

3 简单案例

3.1 最小优先队列

import java.util.PriorityQueue;
public class Main {
	static int[] a={6,4,7,3,9,8,1,2,5,0};
	public static void main(String[] args) {
		fun();
	}
	static void fun() {
		PriorityQueue<Integer> que=new PriorityQueue<Integer>();
		for(int e:a) {
			que.add(e);
		}
		for(int e:que) {
			System.out.print(e+" ");
		}
		System.out.println();
		while(!que.isEmpty()) {
			int e=que.remove();
			System.out.print(e+" ");
		}
	}
}

运行结果:

0 1 3 4 2 8 7 6 5 9 
0 1 2 3 4 5 6 7 8 9 

堆结构:

最小优先队列内部堆结构

3.2 最大优先队列

import java.util.Comparator;
import java.util.PriorityQueue;
public class Main {
	static int[] a={6,4,7,3,9,8,1,2,5,0};
	public static void main(String[] args) {
		fun();
	}
	static void fun() {
		PriorityQueue<Integer> que=new PriorityQueue<Integer>(new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {				
				return o2-o1;
			}
		});
		for(int e:a) {
			que.add(e);
		}
		for(int e:que) {
			System.out.print(e+" ");
		}
		System.out.println();
		while(!que.isEmpty()) {
			int e=que.remove();
			System.out.print(e+" ");
		}
	}
}

运行结果:

9 7 8 5 4 6 1 2 3 0 
9 8 7 6 5 4 3 2 1 0 

堆结构:

最大优先队列内部堆结构

3.3 topK问题

topK问题是指:从海量数据中寻找最大的前k个数据,比如从1亿个数据中,寻找最大的1万个数。

使用优先队列,能够很好的解决这个问题。先使用前1万个数构建最小优先队列,以后每取一个数,都与队头元素进行比较,若大于队头元素,就将队头元素删除,并将该元素添加到优先队列中;若小于队头元素,则将该元素丢弃掉。如此往复,直至所有元素都访问完。最后优先队列中的1万个元素就是最大的1万个元素。

为方便实验,这里以求 {6,4,7,3,9,8,1,2,5,0} 中最大的5个数为例。

import java.util.PriorityQueue;
public class Main {
	static int[] a={6,4,7,3,9,8,1,2,5,0};
	public static void main(String[] args) {
		fun();
	}
	static void fun() {
		PriorityQueue<Integer> que=new PriorityQueue<Integer>();
		for(int i=0;i<5;i++) {
			que.add(a[i]);
		}
		for(int i=5;i<10;i++) {
			if(a[i]>que.element()) {
				que.remove();
				que.add(a[i]);
			}
		}
		while(!que.isEmpty()) {
			int e=que.remove();
			System.out.print(e+" ");
		}
	}
}

运行结果:

5 6 7 8 9

到此这篇关于Java中优先队列PriorityQueue常用方法示例的文章就介绍到这了,更多相关优先队列PriorityQueue常用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Minio实现上传文件的完整步骤记录

    SpringBoot整合Minio实现上传文件的完整步骤记录

    MinIO是一个基于Apache License v2.0开源协议的对象存储服务,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,下面这篇文章主要给大家介绍了关于SpringBoot整合Minio实现上传文件的完整步骤,需要的朋友可以参考下
    2022-05-05
  • JAVA类之间方法的调用问题小结

    JAVA类之间方法的调用问题小结

    文章详细介绍了静态方法和非静态方法在不同情况下的调用方式,包括同一类内和不同类之间的调用,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友参考下吧
    2026-01-01
  • SpringBoot项目修改访问端口和访问路径的方法

    SpringBoot项目修改访问端口和访问路径的方法

    这篇文章主要介绍了SpringBoot项目修改访问端口和访问路径的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 一文带你了解如何正确使用MyBatisPlus

    一文带你了解如何正确使用MyBatisPlus

    在本篇文章中,我们奖通过 MyBatis Plus 来对一张表进行 CRUD 操作,来看看是如何简化我们开发的。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • MyBatis游标Cursor在Oracle数据库上的测试方式

    MyBatis游标Cursor在Oracle数据库上的测试方式

    这篇文章主要介绍了MyBatis游标Cursor在Oracle数据库上的测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Spring中@Configuration和@Component注解的区别及原理

    Spring中@Configuration和@Component注解的区别及原理

    这篇文章主要介绍了Spring中@Configuration和@Component注解的区别及原理,从功能上来讲,这些注解所负责的功能的确不相同,但是从本质上来讲,Spring内部都将其作为配置注解进行处理,需要的朋友可以参考下
    2023-11-11
  • 详解JAVA流程控制语句

    详解JAVA流程控制语句

    这篇文章主要介绍了Java中的流程控制语句,循环等语句是Java编程中流程控制的基础,需要的朋友可以参考下
    2017-04-04
  • Springboot es包版本异常解决方案

    Springboot es包版本异常解决方案

    这篇文章主要介绍了springboot 项目依赖 es包版本异常,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java8新特性Optional类处理空值判断回避空指针异常应用

    Java8新特性Optional类处理空值判断回避空指针异常应用

    这篇文章主要介绍了Java8新特性Optional类处理空值判断回避空指针异常应用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • maven多模块依赖版本不一致问题解决

    maven多模块依赖版本不一致问题解决

    本文主要介绍了maven多模块依赖版本不一致问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论