我在我的一个应用程序中使用这个BoundedIterator作为内部迭代器。
使用它来制作现有的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);
这段代码能够跳过原始迭代器上的 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
跳过和限制元素的方式的问题:
有界迭代器.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 的代码还是仅在我的应用程序的跳过和限制方法中?