Использование итератора над одним и тем же набором более одного раза в java

#java

#java

Вопрос:

Допустим, я выполняю итерацию по набору в java, например

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

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

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

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

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

 while(it.hasNext())
  

опять?

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

Комментарии:

1. Почему бы вам не написать простой тест, и вы сможете почувствовать удовлетворение, выяснив, работает ли это самостоятельно.

Ответ №1:

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

Комментарии:

1. Конечно, вы не можете предполагать, что порядок остается тем же, если базовая Set реализация не обеспечивает строгий порядок. Таким образом, вы рискуете, предполагая, что два вызова для Iterator дадут вам одинаковый порядок для содержимого. 😉

Ответ №2:

Извините, но в контракте an Iterator указано, что вы можете выполнить это только один раз.

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

Ответ №3:

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

Ответ №4:

Как я полагаю, вы обнаружили, у Iterator нет метода «reset»… таким образом, вы просто берете ДРУГОЙ итератор. Просто.

Ответ №5:

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

Ответ №6:

Это правда, что итераторы предназначены только для одноразового использования, но существует класс с именем 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
}
  

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

Комментарии:

1. Вы всегда можете создать свой собственный итератор и настроить его по своему усмотрению.