2015-11-10 2 views
2

Я пытаюсь сделать цикл по каждому элементу, как следует для LinkedList-эск класса, который я построил:реализация Итератор вызывает бесконечный цикл

boolean contains = false; 
for(Thing t : front) { 
    if(t.equals(something)) { 
     t.doSomething(); 
     contains = true; 
     break; 
    } 
} 

Это те методы, итераторы я реализовал:

@Override 
public Iterator<Thing> iterator() { 
    Thing current = this; 
    return new Iterator<Thing>() { 
     public boolean hasNext() { 
      return current.hasNext(); 
     } 

     public Thing next() { 
      return current.next; 
     } 
    }; 
} 

Я пробовал отлаживать это, и кажется, что он не возвращает следующий элемент в связанном списке, тем самым вызывая бесконечный цикл, когда я запускаю его и пытаюсь выполнить цикл foreach.

Извините, если на этот вопрос был дан ответ или есть действительно глупая ошибка, я искал какое-то время и не смог найти ответ. Это мой первый раз, написав итератор, поэтому, пожалуйста, будьте осторожны. :)

ответ

6

Вы должны продвигать его государство Iterator «s в next():

public Thing next() { 
     current = current.next; 
     return current; 
    } 

В противном случае, все вызовы next() будет возвращать один и тот же элемент.

EDIT:

Вы должны переместить локальную переменную декларацию Thing current = this; внутри экземпляра анонимного класса (то есть превратить его в переменный экземпляре).

@Override 
public Iterator<Thing> iterator() { 
    return new Iterator<Thing>() { 

     private Thing current = Thing.this; 

     public boolean hasNext() { 
      return current.hasNext(); 
     } 

     public Thing next() { 
      current = current.next; 
      return current; 
     } 

    }; 
} 
+0

Когда я это делаю, я получаю сообщение об ошибке в Eclipse: «Локальный переменный ток, определенный в закрывающей области, должен быть окончательным или эффективно окончательным». Я попытался изменить следующий метод на следующий: public Thing next() { \t Thing tmp = current; \t tmp = current.next; \t return tmp; } Но он все еще не переходит к следующему элементу в списке. – Tbs95

+0

@ Tbs95 Анонимный класс в методе не имеет прав на внесение изменений в переменные внутри метода размещения. Вам нужно сделать переменную 'current' переменной экземпляра' Iterator', потому что она является частью состояния итератора. – khelwood

+0

Спасибо @Eran, но теперь, когда я изменил местоположение объявления переменных, я получаю ошибку типа Mismatch, конвертирующую новый Iterator () {} в Thing. – Tbs95

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