В чем затык. Я пытался делать задачу через итераторы и немного сломал мозг. Предположим я создаю листитератор и иду с конца.
ListIterator<String> listIterator = strings.listIterator(strings.size());
int counter = 0;
while (listIterator.hasPrevious() && counter < 13) {
aStringToAdd = listIterator.previous();
System.out.println(aStringToAdd);
listIterator.remove();
System.out.println("after removal " + strings);
//тут должен быть код для добавления
}
Он отлично идет с удалением.. но когда я пытаюсь добавить еще 1 итератор с начала (чтобы добавлять строчку), он выкидывает исключение. А ведь по заданию "удали строчку И добавь". А итератор-то текущий... с конца.
где //тут должен быть код для добавления я добавляю цикл с кодом типа:
while(iterator.hasNext()){
iterator.add(aStringToAdd );
}
(за точность кода не ручаюсь, но я думаю, вопрос понятен)
и выскакивает эксепшен, хотя 2 итератора "порознь" работают ок. То же исключение возникает, когда я хочу напрямую в коллекцию, минуя второй итератор, добавить элемент, а-ля list.add(0, aStringToAdd); (ну тут уже логично вполне)
Вполне возможно, я не так как нужно понимаю итераторы, но в моем представлении чтобы что-то делать с коллекцией (модицифировать ее) и одновременно по ней "бегать", итераторы - вполне себе вариант. Только удалять и добавлять нужно именно через них.
Возможно (и наверняка) в моей голове что-то перемкнуло и я не очень понимаю КОГДА использовать итераторы. Но если я верно понял интернет-источники, ошибка может выскочить либо в ситуации когда: (где под капотом используются итераторы)
for (String elem : list) {
if (elem.equals("a")) {
list.remove(elem);
}
}
либо в варианте:
while (it.hasNext()) {
Integer value = it.next();
if (value.equals(3))
list.remove(value);
}
и в обоих случаях нужно использовать iter.remove
В решении же с задачи ошибки и не возникает, ибо мы просто запустили обычный цикл:
for (int i = 0; i < 13; i++) {
String string = strings.remove(4);
strings.add(0, string);
}
и просто последовательно добавили+удалили элементы 13 раз...
Так как все-таки с помощью итераторов осуществить мою задумку ?
Или смотреть в сторону хитрых коллекций, что позволяют изменять содержимое во время траверса ?
Или не ломать себе мозг и "забить" ? :)))