Доброго времени суток. Вопрос в следующем, каким образом происходит удаление элементов из коллекции 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();
}
}
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Map не является реализацией интерфейса Collection, тем не менее, является частью фреймворка Collections.
Итератор — внутренний класс в коллекции. удалять и работать с коллекцией лучше через итератор, так безопаснее. Если удаляешь элемент из коллекции, порядок элементов в коллекции меняется. Поэтому если ты бежишь по коллекции и в тот же момент удаляешь из нее элементы, то в таком варианте можно получить непредвиденный результат, например NPE. Поэтому лучше удалять через итератор, там все эти моменты предусмотрены.