JavaRush/Java блог/Архив info.javarush/Коллекции. Map. Удаление.
oktava
23 уровень

Коллекции. Map. Удаление.

Статья из группы Архив info.javarush
участников
Доброго времени суток. Вопрос в следующем, каким образом происходит удаление элементов из коллекции Map. Пытаюсь решить очередную задачу и не могу продвинуться дальше, так как не понимаю по какому принципу происходит удаление из коллекции. Суть в том, чтобы удалить одинаковые элементы из коллекции, сравнение происходит по значению (value). Из лекций 8-го уровня я понял, что "iterator" - это что-то вроде ссылки на нашу коллекцию. Поэтому создал 2 таких ссылки и путем сравнения элементов в коллекции решил удалять элементы на которые ссылается эта ссылка(объект) iterator2. Разъясните, почему я делаю не правильно. Очень хочу понять где я не прав. Спасибо всем кто отзовется. for (Iterator> iterator1 = map.entrySet().iterator(); iterator1.hasNext();){ HashMap.Entry pair1 = iterator1.next(); for (Iterator> iterator2 = map.entrySet().iterator(); iterator2.hasNext();) { HashMap.Entry pair2 = iterator2.next(); if(pair1.getValue().equals(pair2.getValue())){ map.remove(pair2.getKey()); } } } Еще вариант реализации удаления из коллекции Iterator> iterator1 = map.entrySet().iterator(); while(iterator1.hasNext()){ Map.Entry pair1 = iterator1.next(); Iterator> iterator2 = map.entrySet().iterator(); while(iterator2.hasNext()){ Map.Entry pair2 = iterator2.next(); if (pair1.getValue().equals(pair2.getValue())){ iterator2.remove(); } } }
Комментарии (14)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Duckpool утка в Лига Expert
19 декабря 2019, 11:17
Спасибо!
Fry
Уровень 41
1 сентября 2015, 10:56
Первое.
Map не является реализацией интерфейса Collection, тем не менее, является частью фреймворка Collections.
Итератор — внутренний класс в коллекции. удалять и работать с коллекцией лучше через итератор, так безопаснее. Если удаляешь элемент из коллекции, порядок элементов в коллекции меняется. Поэтому если ты бежишь по коллекции и в тот же момент удаляешь из нее элементы, то в таком варианте можно получить непредвиденный результат, например NPE. Поэтому лучше удалять через итератор, там все эти моменты предусмотрены.
oktava
Уровень 23
1 сентября 2015, 12:10
Спасибо. Теперь мне более ясно, в чем я был не прав. Получается есть четыре интерфейса в фреймворке Collections, а у каждого интерфейса свои collection view'ы(реализации или представления структур данных). Вроде как… Могу ошибаться конечно.
Dmitriy
Уровень 22
26 декабря 2018, 10:07
Напишите пожалуйста синтаксис. Итерироваться могу. Удалять могу. Удалять во время итерации не могу.
Kirill
Уровень 17
27 ноября 2019, 19:24
год прошел 😁, но может кому пригодится:
Iterator<Map.Entry<String, Integer>> entryIterator = map.entrySet().iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, Integer> entry = entryIterator.next();
            if (entry.getValue() < (Integer)500) {
                entryIterator.remove();
            }
        }
Raudis
Уровень 10
29 ноября 2019, 06:31
Пригодилось
Duckpool утка в Лига Expert
19 декабря 2019, 11:17
спасибо!
dmk
Уровень 17
11 января 2020, 20:04
А зачем приведение типа (Integer) ?
Kirill
Уровень 17
13 января 2020, 16:50
Уже не помню задачку, видимо погорячился :). Наверное поставил приведение, чтобы наверняка сравнивался Integer с Integer, а не с int'ом
15 января 2020, 04:23
можно коротко: map.entrySet().removeIf(entry -> entry.getValue() < 500);
Radik Gismatullin
Уровень 23
27 января 2020, 20:51
спасибо!
16 мая 2020, 13:00
спасибо
Pa Vel
Уровень 19
6 июня 2020, 16:17
Лямбды рулят. В такой записи прям всё понятно, нет нагромождения кода!
feas
Уровень 9
14 октября 2020, 20:10
Спасибо. Просто и понятно)