1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
public class TopK<E extends Comparable<E>> {
private final int k; private final transient ReentrantLock lock = new ReentrantLock();
private final PriorityQueue<E> q = new PriorityQueue<>();
public TopK(int k) { if (k <= 0) throw new IllegalArgumentException("TopK k = " + k + " <= 0 !!!"); this.k = k; }
public void put(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { q.offer(e); if (q.size() > k) { q.poll(); } } finally { lock.unlock(); } }
public List<E> get() { final ReentrantLock lock = this.lock; lock.lock(); try { ArrayList<E> es = new ArrayList<>(q); es.sort(Comparator.reverseOrder()); return es; } finally { lock.unlock(); } }
public void clear() { final ReentrantLock lock = this.lock; lock.lock(); try { q.clear(); } finally { lock.unlock(); } } }
|