0

この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 のコードですか、それともアプリのスキップ メソッドと制限メソッドだけですか?

4

1 に答える 1