package com.koala.common.utils;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Random;
/**
* 求topK问题的工具类
*
* @author yanghang
*/
public class TopKHeap<T> {
/**
* 优先级队列,底层实现类
*/
PriorityQueue<T> priorityQueue;
/**
* 求top几
*/
int k;
/**
* 比较器
*/
Comparator<T> comparator;
/**
* 构造函数
*
* @param comparator 比较器
* @param k top几
*/
public TopKHeap(Comparator<T> comparator, int k) {
this.k = k;
this.comparator = comparator;
priorityQueue = new PriorityQueue<>(k, comparator);
}
/**
* 新增元素,底层基于 {@link PriorityQueue#offer(Object)}
*
* @param t 需要新增的元素
* @return true {@link PriorityQueue#offer(Object)}
*/
public boolean offer(T t) {
if (priorityQueue.size() < k) {
priorityQueue.offer(t);
} else if (comparator.compare(priorityQueue.peek(), t) < 0) {
priorityQueue.poll();
priorityQueue.offer(t);
}
return true;
}
/**
* 获取topK的集合
*
* @return {@link LinkedList}
*/
public List<T> getTopK() {
int size = priorityQueue.size();
List<T> res = new LinkedList<>();
while (size-- > 0) {
res.add(priorityQueue.poll());
}
return res;
}
public static void main(String[] args) {
TopKHeap<Integer> heap = new TopKHeap<>(Comparator.comparingInt(o -> o), 5);
Random random = new Random();
for (int i = 100; i > 0; i--) {
heap.offer(random.nextInt(100));
}
System.out.println(heap.getTopK());
}
}
求topK问题的工具类(纯代码)
原创
©著作权归作者所有:来自51CTO博客作者wx58c8fa5d0b356的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:ngrok | 内网穿透工具
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
封装一个工具类,拒绝重复代码!
封装一个工具类,拒绝重复代码!
List 字段 工具类 -
SpringBoot隐藏的几个工具类
SpringBoot隐藏的几个工具类
SpringBoot 工具类 -
【TopK问题】——用堆实现
Topk问题,用堆实现
时间复杂度 父节点 堆排序