このBoundedIteratorをアプリの 1 つで内部イテレータとして使用しています。
それを使用して既存のIterator
境界を作成します。
public DBCursor limit(Integer limit){
this.max = limit;
this._it = new BoundedIterator<DBObject>(this.offset, this.max, this._it);
return this;
}
public DBCursor skip(Integer skip){
this.offset = skip;
this._it = new BoundedIterator<DBObject>(this.offset, this.max, this._it);
return this;
}
これはうまくいきます:
DBCursor cursor = new DBCursor(it).limit(5).skip(1);
このコードは、元の Iterator で 1 項目をスキップし、結果を 5 に制限することができます。
見る:
{"_id":"51a6dc852318dcd7f1e1c09f","number":2}
{"_id":"51a6dc852318dcd7f1e1c0a0","number":3}
{"_id":"51a6dc852318dcd7f1e1c0a1","number":4}
{"_id":"51a6dc852318dcd7f1e1c0a2","number":5}
最初の要素がスキップされ、最後の要素は 5 です。
問題は、これが完了したときです。
DBCursor cursor = new DBCursor(it).skip(5).limit(1);
これは空の結果を返します。
私の予想される結果は、5 つの要素をスキップし、結果を 1 に制限することです。
BoundedIterator
これは、要素をスキップして制限する方法に問題があると思います。
BoundedIterator.java
public boolean hasNext() {
if (next == null) {
fetchNext();
}
return next != null;
}
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return consumeNext();
}
public void remove() {
throw new UnsupportedOperationException();
}
private void fetchNext() {
for (; pos < offset && iterator.hasNext(); pos++) {
next = iterator.next();
}
if (pos < offset || !iterator.hasNext() || max >= 0 && pos - offset + 1 > max) {
next = null;
}
else {
next = iterator.next();
pos++;
}
}
private T consumeNext() {
T element = next;
next = null;
return element;
}
このコードで改善すべき点。変更する必要があるのは BoundIterator のコードですか、それともアプリのスキップ メソッドと制限メソッドだけですか?