Какие именно операции выполняет расширенный цикл for для связанного списка для каждой итерации? - PullRequest
3 голосов
/ 30 марта 2012
for (String msg : messages) {
    System.out.println(msg);
}

Скажите, что сообщения - это правильно инициализированный циклически двусвязный список, в котором нет указателя на начало или конец (ссылка). То есть он просто имеет текущий указатель узла. Мой вопрос просто заключается в том, что именно делает цикл for для каждой итерации. При необходимости у меня есть интерфейс, который я могу опубликовать для этого специального типа ADT, сообщения которого:

Вот итератор:

import java.util.*;
public class LinkedCircularSequenceIterator<E> implements Iterator<E> {
     private DblListnode<E> curr;
     private int itemsLeft;

  public LinkedCircularSequenceIterator(DblListnode<E> curr, int numItems) {
    this.curr = curr;
    this.itemsLeft = numItems;
  }

  public boolean hasNext() {
    return itemsLeft > 1;
  }

  public E next() {
    if(!hasNext()) {
        throw new NoSuchElementException();
    }
    curr = curr.getNext();
    itemsLeft--;

    return curr.getPrev().getData();
  }

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

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Улучшенный цикл for ничего особенного не делает.

for (T i : aCollection) {
  doSomething;
}

просто переводится как

for (Iterator<T> itr = aCollection.iterator(); itr.hasNext(); ) {
  T i = itr.next();
  doSomething;
}

Итератор выполняет итерацию по коллекции, и он не имеет ничего общего с расширенным циклом for.

3 голосов
/ 30 марта 2012

Это должно быть что-то вроде

Iterator<Message> iter = messages.iterator();
while (iter.hasNext()){
    msg=iter.next().toString();
    System.out.println(msg);
}
...