public static void removeTheFirstNameDuplicates(Map<String, String> map) {
//напишите тут ваш код
Iterator<Map.Entry<String,String>> i = map.entrySet().iterator();
String pastName = "";
while (i.hasNext()) {
String curName = i.next().getValue();
if (!curName.equals(pastName)) {
pastName = curName;
}else {
removeItemFromMapByValue(map, curName);
}
}
}
public static void removeItemFromMapByValue(Map<String, String> map, String value) {
Map<String, String> copy = new HashMap<>(map);
for (Map.Entry<String, String> pair : copy.entrySet()) {
if (pair.getValue().equals(value)) {
map.remove(pair.getKey());
}
}
}
public static void main(String[] args) {
Map a = createMap();
System.out.println(a);
removeTheFirstNameDuplicates(a);
System.out.println(a);
}Kirill Osipov
20 уровень
Что не так с методом removeTheFirstNameDuplicates ? Почему возникает ошибка? Проходил отладчиком - после удаления элемента дубля i.hasNext() выдает true но при попытке получения значения вываливается exception
Обсуждается
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
26 апреля 2020, 18:40
Потому что итератор позволяет безопасно удалять элементы во время перебора только при использовании его собственного метода remove.
А у тебя удаление выполняется другим методом.
0
Kirill Osipov1с программист в ООО Тройка
26 апреля 2020, 18:43
И что делать? Не использовать итератор? Цикл for так же не работает, а удаление происходит в другом методе, который вроде реализован и в нем не требуется вносить изменения, или я не прав?
0
Ksenia VolkovaJava Developer в DXCMaster
26 апреля 2020, 18:46
Да, поскольку в данном случае итератором удалять не выйдет, то он тут не поможет.
0
Kirill Osipov1с программист в ООО Тройка
26 апреля 2020, 18:48
Так с циклом for тоже вылетает ошибка. Как быть?
0
Ksenia VolkovaJava Developer в DXCMaster
26 апреля 2020, 18:51
Например - сначала находишь дублирующиеся имена, кладешь в одельный список, потом имена из списка передаешь в removeItemFromMapByValue.
Или работаешь с копией мапы - см. реализацию removeItemFromMapByValue.
0