2013-05-30 31 views
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); 

这pieceof代码能够跳过的一部开拓创新的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的代码或者仅仅在我的应用程序的跳过和限制方法中?

回答

0

在BoundedEditor.java变化POS - 胶印+ 1>最大到POS - 胶印+ 1> =最大值

+0

这种变化在我的应用程序失败造成的单元测试...我的意思是用于工作 – xybrek