Не понимаю с какой целью мы создаем новый set в методе и присваиваем ему значение входного параметра? Почему нельзя сразу удалять элементы из взодного параметра? (вопрос про решение, предложенное на сайте)
Александр Гуськов
22 уровень
Зачем копировать Set
Обсуждается
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ГоффMaster
10 июля 2021, 16:45
И какое решение предложено на сайте?
0
Александр Гуськов
10 июля 2021, 16:57
package com.javarush.task.task08.task0814;
import java.util.HashSet;
import java.util.Set;
/*
Больше 10? Вы нам не подходите
*/
public class Solution {
public static Set<Integer> createSet() {
// напишите тут ваш код
Set<Integer> set = new HashSet<>();
set.add(16);
set.add(26);
set.add(36);
set.add(46);
set.add(56);
set.add(66);
set.add(76);
set.add(86);
set.add(10);
set.add(6);
set.add(17);
set.add(27);
set.add(37);
set.add(47);
set.add(57);
set.add(67);
set.add(77);
set.add(87);
set.add(97);
set.add(7);
return set;
}
public static Set<Integer> removeAllNumbersGreaterThan10(Set<Integer> set) {
// напишите тут ваш код
// Set<Integer> copy = new HashSet<>(set);
// for (Integer n: copy){
// if (n >= 10) {
// set.remove(n);
// }
// }
// return copy;
Set<Integer> copy = new HashSet<>(set);
for (Integer number : copy) {
if (number > 10) {
set.remove(number);
}
}
return set;
}
public static void main(String[] args) {
}
}
0
ГоффMaster
10 июля 2021, 17:01
Потому что там цикл for (Integer number : copy) ...
При запуске такого цикла в фоне создаётся итератор - перечень элементов. Если внутри цикла из коллекции элемент удаляется (или добавляется), то перечень перестаёт соответствовать коллекции и машина вываливается в ошибку. Поэтому делают копию, цикл запускают по копии, а удаляют из оригинала, что бы не нарушать соответствие перечня и коллекции, по которой бежит цикл.
0
ГоффMaster
10 июля 2021, 17:03
Но с копией - не единственный трик. Можно создать итератор вручную и для удаления пользоваться методом iterator.remove() - этот метод удалит элемент и из перечня, и из коллекции, соотвествие не нарушится.
0
Александр Гуськов
10 июля 2021, 17:16
понял, спасибо большое
0
Михаил
10 июля 2021, 16:45
код приложи. Обычно копия нужна, чтобы удалить из оригинала ячейки. Если конечно не использовать итератор.
0
Александр Гуськов
10 июля 2021, 16:58
понял, спасибо большое!
0