Использование итератора для одного и того же набора более одного раза в Java - PullRequest
3 голосов
/ 01 мая 2011

Скажем, я перебираю набор в java, например,

Iterator<_someObject_> it = _someObject_.iterator();

ну, сначала я хочу просмотреть каждый объект в наборе и внести изменения в каждый объект, который я посещаю.Поэтому я использую:

while(it.hasNext()) {
        _someObject_ = it.next();
        _someObject_.add3();       //made up method
    }

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

Могу ли я просто использовать

while(it.hasNext())

снова?

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

Ответы [ 6 ]

10 голосов
/ 01 мая 2011

Нет, вы не можете сделать это. Просто попросите объект Iterable для другого итератора.

4 голосов
/ 01 мая 2011

Извините, но контракт Iterator гласит, что вы можете пройти его только один раз.

Учитывая, что вы не можете точно знать порядок следующего итератора или даже содержимое этого вопроса (оно может измениться!), Вам лучше выполнять все модификации или вызовы методов в одном и том же блоке.

2 голосов
/ 01 мая 2011

Итераторы предназначены только для одноразового использования.

0 голосов
/ 01 мая 2011

Это правда, что итераторы предназначены только для одноразового использования, но есть класс с именем ListIterator, который позволяет вам делать это, оглядываясь на список. Примером может быть:

ArrayList<String> list = new ArrayList<String>();
list.add("hey!");
list.add("how");
list.add("are");
list.add("you?");
ListIterator it = list.listIterator();
while(it.hasNext()){
   System.out.println(it.next() +" ");//you print all the elements
}
//Now you go back. You can encapsulate this while sentence into a void reset method.
while(it.hasPrevious()){
   it.previous();
}
//Now you check that you've reached the beginning of the list
while(it.hasNext()){
   System.out.println("back " + it.next() +" ");//you print all the elements
}

Я думаю, что этот класс может быть вам полезен.

0 голосов
/ 01 мая 2011

it.hasNext() ложно после цикла, именно поэтому цикл while заканчивается.Если вы сделаете еще один while(it.hasNext()), то it.hasNext() все равно будет ложным, поэтому этот цикл немедленно завершится.Вам нужен новый итератор для вашего нового цикла.

0 голосов
/ 01 мая 2011

Как я полагаю, вы обнаружили Итератор не имеет метода "сброса" ... поэтому вы просто берете ДРУГОЙ Итератор. Простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...