Зачем нужен метод remove в итераторе, если у каждой коллекции есть свой remove?
Подскажите, зачем нужен метод remove в итераторе, если у каждой коллекции есть свой remove? Все ответы, которые были мной найдены, очень расплывчаты.
Подскажите, зачем нужен метод remove в итераторе, если у каждой коллекции есть свой remove? Все ответы, которые были мной найдены, очень расплывчаты.
Метод remove()
итератора нужен для того, чтобы мы могли удалять элементы коллекции во время прохода по ней.
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next(); // можно что-то сделать с этим элементом
iterator.remove();
}
System.out.println(list);
Результат:
[]
Если попробовать сделать удаление элементов коллекции при проходе по ней в цикле foreach, который обычно очень удобен и часто используется, то будет выброшено исключение.
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
for (int i : list) {
list.remove(i);
}
System.out.println(list);
Результат:
Exception in thread "main" java.util.ConcurrentModificationException
Для коллекций, реализующих List
, можно использовать тот факт, что в них имеется возможность брать элемент по индексу.
Вариант с удалением элемента из начала:
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
int size = list.size();
for (int i = 0; i < size; ++i) {
Integer element = list.get(0); // можно что-то сделать с полученным элементом
list.remove(0);
}
System.out.println(list);
Вариант с удалением элемента из конца:
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
while (list.size() > 0) {
int lastIndex = list.size() - 1;
Integer elem = list.get(lastIndex);
list.remove(lastIndex);
}
System.out.println(list);
Результат в обоих случаях:
[]
Однако дело в том, что оба этих варианта не очень похожи на то, что мы пытались проделывать с foreach и успешно проделали с итератором. Тут как такового нет прохода по элементам коллекции.
Наконец, проблема в том, что мы можем иметь дело, например, с Set
. В множествах нет такого понятия как "получение элемента по индексу", поэтому описанные выше варианты со взятием отдельного элемента мы применить вообще не сможем. Цикл foreach при попытке удалить элемент бросит исключение. Остаётся итератор.
Вот тут можно прочитать хороший и подробный ответ про разницу между итератором и циклом.