2015-04-07 3 views
0

Вот моя реализация iterator над ArrayList:Проблема реализации ArrayList итератора в Java

public class MyClass { 

    List<E> list = new ArraList<E>(); 

public Iterator<E> iterator() { 

     return new MyIterator<E>(); 
    } 

private class MyIterator<T> implements Iterator<E> { 

    int index; 

     public MyIterator() { 

      index = 0; 

     } 

     public E next() { 

      if (hasNext()){ 
      index++; 
      return list.get(index + 1); 
     } 

     else 
      throw new NoSuchElementException(); 
     } 

     public boolean hasNext() { 

     if ((list.get(index + 1) != null) && (index < list.size() -1)){ 
       index++; 
       return true; 
      } 
      else 
       return false; 
     } 

     public void remove() { 
      throw new UnsupportedOperationException(); 
     } 

    } 

} 

Однако, хотя логика выглядит хорошо для меня, эта реализация не так, потому что он не работает должным образом.

Мой вопрос: что я делаю неправильно, и как я могу его изменить, чтобы он работал правильно?

UPDATE:

public E next() { 

     if (index == 0) { 
      index++; 
      return list.get(0); 
     } 

     else if (hasNext()) { 
      index++; 
      return list.get(index); 
     } 

     else 
      throw new NoSuchElementException(); 
    } 

мне удалось каким-то образом, заставить его работать, но теперь следующий метод пропускает индексы массива. Как я могу это исправить ?

+0

Что вы подразумеваете под "правильной работой"? Возможно, вам будет легче выяснить, что происходит, если вы пишете единичный тест для своего кода. – Trisha

+0

Что значит «это не работает должным образом» - будьте конкретны. Кроме того, что такое «PacoteIterator» – NoseKnowsAll

+0

@Trisha, следующий метод возвращает 'ArrayOutOfBoundsException'i, не знаю почему – laker001

ответ

1

Без примера того, как вы используете этот итератор, трудно дать вам совет. При этом, по крайней мере, две вещи, которые вы делаете неправильно. В вашем методе next(), у вас есть

index++; 
return list.get(index + 1); 

Таким образом, вы будете сначала приращение индекса, а затем возвращаетесь следующий индекс. Это должно привести к исключению из-за пределов. Изменить его для возврата list.get(index);

Во-вторых, ваш метод hasNext() не заказан правильно. То есть вы должны проверить, действительно ли ваш следующий индекс действителен, прежде чем проверять, существует ли следующий объект или нет. Изменять порядок, если заявление:

if ((index < list.size() -1) && (list.get(index + 1) != null)) 

Также избавиться от index++; линии в hasNext(). Метод должен просто проверять достоверность, а не изменять текущий индекс. Это должно произойти в next().

+0

Я использую итератор для навигации по списку, получения определенного элемента, печати определенного элемента, такого рода операций. моя проблема связана с методами 'next()' и 'hasNext()', которые не делают то, что они должны делать – laker001

+0

Ну в этом случае проверьте мое редактирование. Думаю, я нашел еще 2 вещи, которые вы сделали неправильно. – NoseKnowsAll

+0

Пожалуйста, уточните мое обновление! – laker001