2013-05-30 2 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 способен пропустить 1 пункт на Orignal итератора, а затем ограничить результат 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 - смещение + 1> Макс в пос - офсет + 1> = макс

+0

, что изменение вызвано юнит-тесты в мое приложение, чтобы потерпеть неудачу ... Я имею в виду, что используется для работы – xybrek

Смежные вопросы