Проблема с функцией void removeTheFirstNameDuplicates(Map<String, String> map).
Внутри неё создал множество всех ключей, чтобы пробежать по каждому из них. Для каждого ключа -> если находим в мапе еще один элемент с таким же значением, но другим ключом, то отправляем его значение в void removeItemFromMapByValue(Map<String, String> map, String value), которая удаляет из мапы всё с значением value.
Возникает проблема, что мы можем бегать итератором по несуществующим ключам, которые уже были удалены из мапы предыдущими проходами. Поэтому для каждого нового ключа из множества делаю проверку, есть ли он еще в мапе. Если его уже нет, то как-то работать с ним бессмысленно.
Выкидывается ошибка ConcurrentModificationException, которая, как я понял, связана с изменениями в коллекции, но где конкретно возникает и почему, пока что не понимаю
package com.javarush.task.task08.task0817;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*
Нам повторы не нужны
*/
public class Solution {
public static Map<String, String> createMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("1","a");
map.put("2","b");
map.put("3","c");
map.put("4","a");
map.put("5","d");
map.put("6","e");
map.put("7","c");
map.put("8","a");
map.put("9","g");
map.put("10","h");
return map;
}
public static void removeTheFirstNameDuplicates(Map<String, String> map) {
Set<String> key = map.keySet();
Iterator<String> iterator = key.iterator();
// бегаем по каждому ключу
while(iterator.hasNext()){
String s = iterator.next();
if(!map.containsKey(s))
continue;
//для каждой пары ключ-значение
for(Map.Entry<String, String> pair : map.entrySet()){
/**
* если значения равны и ключи разные, то удаляем все элементы с этим значением в map<String, String>
* map.get(s) ведь можно использовать? s - текущий key.
*/
if(pair.getValue() == map.get(s) && pair.getKey() != s) {
removeItemFromMapByValue(map, pair.getValue());
}
}
}
}
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) {
removeTheFirstNameDuplicates(createMap());
}
}