四、leetcode之TopN的实现

PriorityQueue是java中数据结构Queue的实现子类,按照源码中标注的原意:PriorityQueue是一个有着默认容量大小(DEFAULT_INITIAL_CAPACITY = 11)并且内部元素是按照指定的比较器方式所排列的。

一般构造方法
//无参构造,默认容量为11
public PriorityQueue() {
        this(DEFAULT_INITIAL_CAPACITY, null);
    }

//指定容量大小构造队列
public PriorityQueue(int initialCapacity) {
        this(initialCapacity, null);
    }

//指定队列所使用的比较规则,传入一个自定义的比较器
public PriorityQueue(Comparator<? super E> comparator) {
        this(DEFAULT_INITIAL_CAPACITY, comparator);
    }

//其他构造器默认调用的最核心的构造方法,传入容量大小和自定义的比较器
public PriorityQueue(int initialCapacity,
                         Comparator<? super E> comparator) {
        // Note: This restriction of at least one is not actually needed,
        // but continues for 1.5 compatibility
        if (initialCapacity < 1)
            throw new IllegalArgumentException();
        this.queue = new Object[initialCapacity];
        this.comparator = comparator;
    }
常用方法

①boolean add(E o):将指定的元素插入优先队列中
②void clear():清理队列元素
③boolean contains(object o):查看是否元素包含在队列中
④boolean offer(E o):将指定的元素插入优先队列中
⑤E peek():返回队列头部元素
⑥E poll():弹出队列头部元素
⑦boolean remove(object o):删除某个元素(如果存在的话)

温馨提示***:应该会有人好奇add和offer方法的区别,看了介绍没看出哪里不一样对吧。其实我也没看出。所以去看了下源码,如下:
public boolean add(E e) { return offer(e); }
这里大家应该就知道了,其实add方法底层调用的就是offer方法,也就是说,这俩方法一样。。。。。没什么区别

使用优先队列实现topN

下面会使用lambda表达式快速实现自定义比较器。
lambda表达式是在jdk 1.8之后出现,适用场景:如果一个接口或者类中只有一个待实现的抽象方法,那么就可以使用lambda表达式进行实现该方法。

/**
	 * 首先初始化一个PriorityQueue队列,这里我们使用第三种构造方法
	 * topN可能是取最大的前几位,也可能是取最小的前几位。有限队列默认是升序,
	 * 这里我自定义排序为降序,取最大的前几个数
	 * 升序:new PriorityQueue<Integer>((x,y)->x-y);
	 * 降序:new PriorityQueue<Integer>((x,y)->y-x);
	 * 这里为了方便使用lambda表达式,去实现了compareTo方法
     */
PriorityQueue queue = new PriorityQueue<Integer>((x,y)->x-y);
//给定散乱的元素
int[] arr = new int[]{1,5,3,4,6,9,2,7,8};
//入队列
for(int i:arr){
	//这个时候已经自动在排序了
	queue.add(i);
}
//输出结果  假如输出前k位
for(int j=0;j<k;j++){
	System.out.println(queue.poll());
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值