?
<T> T[] topK(Iterator<? extends T> items, int k, Class<T> clazz, Comparator<? super T> cmp) {
T[] topK = Arrays.newInstance(clazz, k);
if (k == 0) { return topK; }
for (int i = 0; i < k && items.hasNext(); ++i) {
topK[i] = items.hasNext();
}
// TODO: what is the appropriate output when there are less than k input?
Arrays.sort(topK, cmp);
for (T item; items.hasNext();) {
item = items.next();
if (cmp.compareTo(item, topK[k - 1]) < 0) {
int pos = Arrays.binarySearch(topK, item);
if (pos < 0) { pos = ~pos; }
System.arraycopy(topK, pos, topK, pos + 1, k - (pos + 1));
topK[pos] = item;
}
}
return topK;
}
- O (k), , , topK O (log k), , PriorityQueues.