poll()
最小要素が現在の要素よりも小さい場合 (あなたの場合、評価が悪い場合) はキューだけです。
static <V extends Comparable<? super V>>
PriorityQueue<V> nbest(int n, Iterable<V> valueGenerator) {
PriorityQueue<V> values = new PriorityQueue<V>();
for (V value : valueGenerator) {
if (values.size() == n && value.compareTo(values.peek()) > 0)
values.poll(); // remove least element, current is better
if (values.size() < n) // we removed one or haven't filled up, so add
values.add(value);
}
return values;
}
Comparable
これは、組み合わせを評価で比較する を実装するある種の組み合わせクラスがあることを前提としています。
編集:明確にするために、Iterable
私の例では事前に入力する必要はありません。たとえば、が表すことができるIterable<Integer>
すべての自然数を与える は次のとおりです。int
Iterable<Integer> naturals = new Iterable<Integer>() {
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
int current = 0;
@Override
public boolean hasNext() {
return current >= 0;
}
@Override
public Integer next() {
return current++;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
ご覧のとおり、メモリ消費は非常に控えめです。20 億を超える値の場合、2 つのオブジェクト (Iterable
とIterator
) と 1 つの が必要int
です。
もちろん、コードを使用しないように簡単に変更することもできますIterable
。シーケンスを表すエレガントな方法であるため、これを使用しました (また、Python と C# を使いすぎていました☺)。