boolean isDeleted = false;
while (!isDeleted) {
isDeleted = true;
for (int x : set) {
if (x > 10) {
set.remove(x);
isDeleted = false;
break;
}
}
}Сергей
20 уровень
Логично ли данное решение, или это полный бред?
Архивный
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас ПасинковSoftware Developer в ZipyMaster
4 февраля 2018, 17:52
я думаю, что эта задача рассчитана на то, чтобы человек попробовал как работать с итераторами, а не придумывал как обойти ConcurentModificationException при помощи двух вложенных циклов и условий)
+2
Сергей
4 февраля 2018, 19:17
на итераторы были задачи до этих, там уже хватило насоздавать их =) просто, как я понял, все решают это задание через создание дублирующего HashSet, и ,с помощью прохода итератором по основному массиву, удаляют неподходящие элементы из дублирующего, после чего его и возвращают.
И вот я подумал, а не является ли создание еще одного множества бессмысленной тратой памяти, а если там не 20 значений, а 20000?
Вот если с итератором расписать несокращенно:
Тут у меня вопрос соответсвенно, а не тратится ли сэкономленная память на кучу экземпляров итератора?
0
Стас ПасинковSoftware Developer в ZipyMaster
4 февраля 2018, 21:57
"все решают это задание через создание дублирующего HashSet, и ,с помощью прохода итератором по основному массиву, удаляют неподходящие элементы из дублирующего"
на такой код не смотрите)
он может и рабочий, но некрасивый))
такую задачу можно сделать либо через дублирующее множество (что лично мне не оч нравится), либо через итератор (которым спокойно можно идти по оригиналу и сразу удалять из него же. в этом и преимущество итератора в подобных задачах). ну или еще какими-то другими способами. но мне кажется, вариант с итератором - самый оптимальный)
0
Стас ПасинковSoftware Developer в ZipyMaster
4 февраля 2018, 22:01
а в вашем коде с итератором 11ю строку заменить на
да, удалять надо именно итератором. если делать set.remove() - то смысл использования итератора теряется, ведь вы снова можете словить так ConcurentModificationException.
13ю и 14ю строки удалить совсем.
и еще, а зачем вам переменная isDeleted? в чем логика ее использования?
UPD: аа, точно. вы же используете такой подход, когда если удалили какой-то элемент - то все бросаете и начинаете проходиться заново чтобы избежать того исключения.
в общем, используя итератор этого всего делать не надо. он как-раз и существует чтобы помочь вам избежать этого исключения.
просто один раз создали итератор, прошлись один раз циклом полностью по всем элементам и удалили при помощи итератора нужные. вот и все :)
так что строки 3, 6, 7 и 17ю - тоже удалите. и получите красивый вариант решения :)
0
Стас ПасинковSoftware Developer в ZipyMaster
4 февраля 2018, 22:04решение
в общем, итератор - это просто указатель на какой-то элемент в коллекции.
используя итератор вы можете получить элемент, на который он указывает, или удалить.
ну и понятно что двигать этот указатель, ну и проверять есть ли еще куда его двигать)
+2
Сергеев ВикторMaster
5 февраля 2018, 00:16полезный
ну и в догонку почитайте про Collection.removeIf с ним так вообще в 1 строку задачка решается.
+2
Сергей
5 февраля 2018, 19:45
Стас, спасибо огромное за столь развернутый ответ =) я именно с помощью итератора и хотел решить это задание, просто в лекции про итератор было сказано, что все, что он умеет это .hasNext() и .next(), а я не удосужился почитать и проверить. А про isDeleted - да, мысли навеяны статьей про пузырьковую сортировку, там такая же переменная isSorted во всех примерах! Всеми этими костылями я пытался заменить незнание метода remove() у итератора.
0
Стас ПасинковSoftware Developer в ZipyMaster
5 февраля 2018, 19:56
я тоже когда-то не знал. это нормально)
сейчас вот пойду читать про Collection.removeIf, о котором я тоже "не знал, не знал - и забыл"))
а вообще заведите себе привычку такую: как только встретили незнакомый класс - не поленитесь, откройте его документацию и просто почитайте какие методы там есть и для чего они нужны. не надо там пытаться их запоминать, или что-то такое. просто чтоб у вас в голове отложилось, что для такой-то задачи уже сделан нужный вам метод например. и когда вы с такой задачей столкнетесь - вы хоть примерно будете знать где искать)
0
Сергеев ВикторMaster
4 февраля 2018, 17:40
зачем вам цикл while?
зачем вы выходите из цикла for после 1 удаления? может стоит продолжить, а не начинать с начала?
0
Сергей
4 февраля 2018, 19:02
из цикла я выхожу потому что его продолжение вызовет ошибку итератора, т. к. мы удаляем элемент, на котором он сейчас находится (как я понял), т. е. вот такая конструкция
падает при выполнении...
0
Сергеев ВикторMaster
4 февраля 2018, 19:08
вы же понимаете, что таким решение усложнили алгоритм =)
Т.е.е если у вас 1-2млрд записей, то вам придется постоянно проходить по ним, раз за разом и столько раз сколько записей надо удалить =)
0
Сергей
4 февраля 2018, 19:21
прекрасно понимаю, что усложнил, а принимая в учет мой уровень (8 на момент написания) понимаю, что возможно вообще полный изврат написал =) но у меня встречный вопрос: а правильно ли тратить память на создание дублирующего HashSet на 1-2 млрд записей, как решает это 90% людей?
0
Сергеев ВикторMaster
4 февраля 2018, 19:35
объекты то теже, вы только новые ссылки создаете, а они весят почти ничего.
0