public static Set<Integer> removeAllNumbersGreaterThan10(Set<Integer> set) {
Set<Integer> copy = new HashSet<>(set);
for (Integer number: copy){
if(number > 10){
set.remove(number);
}
}
return set;
}
для чего мы создаем копию, почему нельзя сразу пройтись по set? Есть догадка, что это связано с тем, что нельзя одновременно с "прохождением по файлу удалять из него элементы", так ли это?
TimJohnzz
18 уровень
Хотел бы спросить зачем нужна копия для решени задачи
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Максим
7 сентября 2022, 17:52
Считается, что доступ к такому объекту не безопасен, так-как объект может изменить свое состояние.
В
Этом примере мы итерируемся (проходим по списку) и изменяем его состояние. Фактически изменяем его размерность, а итератор каждый раз вычисляет следующий элемент чтобы отдать его тебе. Получается, что он делает это по постоянно изменяющемуся списку и корректно это делать не может. По этому надо делать копию. Итерируемся по копии и работаем с оригиналом)).
+1
Стас ПасинковSoftware Developer в ZipyMaster
7 сентября 2022, 21:16
не совсем так.
итератор работает вполне корректно. но при условии, что удаление происходит именно используя итератор.
если же удалять элемент коллекции используя саму коллекцию - тогда да, итератор "собьется" и все поломается)
+1
Максим
9 сентября 2022, 21:15
Спасибо за коммент!
Еще раз посмотрел как итератор работает. Здорово, что он умеет удалять без ConcurrentModificationException
Получается, что в foreach итератор используется неявно и к его методу remove обратиться нельзя.
По этому через копию сета и в foreach удаляем через remove() метод сета, или создаем итератор самостоятельно и через for им итерируемся, и тогда можно удалить через метод remove() итератора.
+1
ГоффMaster
9 сентября 2022, 23:05
Именно так. При форыче всегда создаётся анонимный итератор, и если итератор перестаёт соответствовать коллекции, то программа вываливается в ошибку. Это относится не только к удалению, но и к добавлению в коллекцию тоже.
Если ты создаёшь итератор ручками, то ты можешь удалять из итератора, удаление из итератора и из коллекции произойдёт синхронно, соответствие итератора и коллекции не нарушится.
Или работать через копию - тогда тоже соответствие не нарушается. Итератор по копии, удаление из оригинала.
0
Ant
29 августа 2022, 11:55
да, ты прав. Цикл for each не позволит удалять элементы из коллекции, для этого нужно явно использовать итератор, либо копию коллекции, как в этом случае.
+1
TimJohnzz
29 августа 2022, 21:27
спасибо!
0