0

我在我的一个应用程序中使用这个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 的代码还是仅在我的应用程序的跳过和限制方法中?

4

1 回答 1

0

在 BoundedEditor.java 中将 pos - offset + 1 > max 更改为 pos - offset + 1 >= max

于 2013-05-30T05:30:12.437 回答