package edu.stanford.nlp.sempre;
import java.util.*;
/**
* Created by joberant on 3/27/14.
* A priority queue that holds no more than N elements
*/
public class BoundedPriorityQueue<E> extends TreeSet<E> {
private static final long serialVersionUID = 5724671156522771658L;
private int elementsLeft;
public BoundedPriorityQueue(int maxSize, Comparator<E> comparator) {
super(comparator);
this.elementsLeft = maxSize;
}
/**
* @return true if element was added, false otherwise
* */
@Override
public boolean add(E e) {
if (elementsLeft == 0 && size() == 0) {
// max size was initiated to zero => just return false
return false;
} else if (elementsLeft > 0) {
// queue isn't full => add element and decrement elementsLeft
boolean added = super.add(e);
if (added) {
elementsLeft--;
}
return added;
} else {
// there is already 1 or more elements => compare to the least
int compared = super.comparator().compare(e, this.last());
if (compared == -1) {
// new element is larger than the least in queue => pull the least and add new one to queue
pollLast();
super.add(e);
return true;
} else {
// new element is less than the least in queue => return false
return false;
}
}
}
public List<E> toList() {
List<E> res = new ArrayList<>();
for (E e : this)
res.add(e);
return res;
}
public static void main(String[] args) {
BoundedPriorityQueue<Integer> queue =
new BoundedPriorityQueue<>(5,
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
queue.add(10);
queue.add(8);
queue.add(4);
queue.add(12);
queue.add(3);
queue.add(7);
queue.add(9);
for (Integer num : queue) {
System.out.println(num);
}
}
}