public class Solution {
public static Map<String, String> createMap() {
Map<String,String> map = new HashMap<>();
map.put("Ivan","Rect123");
map.put("Ivan1","Rect");
map.put("Ivan2","Rect");
map.put("Ivan3","Rec");
map.put("Ivan4","Rect2");
map.put("Ivan5","Rect11");
map.put("Ivan6","Rect");
map.put("Ivan7","Rect5");
map.put("Ivan8","Rect6");
map.put("Ivan9","Rect");
return map;
}
public static void removeTheFirstNameDuplicates(Map<String, String> map) {
Set<String> unique = new HashSet<>();
Iterator <Map.Entry<String, String>> iterator = map.entrySet().iterator();
for (Map.Entry<String, String> entry : map.entrySet())
{
String b = entry.getValue();
unique.add(b);
}
while(iterator.hasNext())
{
Map.Entry<String, String> pair = iterator.next();
String a = pair.getValue();
if (unique.contains(a)) removeItemFromMapByValue(map,a);
}
}
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<String,String> map2= createMap();
removeTheFirstNameDuplicates(map2);
Iterator <Map.Entry<String, String>> iterator = map2.entrySet().iterator();
while (iterator.hasNext())
{
String a =iterator.next().getValue();
System.out.println(a+"value from map is "+map2.get(a));
}
}
}
вылезает ConcurrentException на 32 строчке и, как следствие, в 50. Ну и в принципе мысль по решению задачи правильная ?Sunshine
19 уровень
Concurrent Exception
Обсуждается
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
АлексейExpert
28 ноября 2019, 10:52
Слишком сложно... Даже не знаю, стоит ли дебажить.
Порой проще переписать под логичную логику.
Вся задача сводится к тому, чтобы создать список дублирующихся имён из мапы, по очереди сравнив каждое значение с каждым.
А потом, еще раз сравнивая этот список с мапой удалять все дубликаты, если их количество более одного.
Два списка там слишком много.
Третий пункт - это что
•
Метод createMap() должен создавать и возвращать словарь Map с типом элементов String, String состоящих из 10 записей.
Скиньте код этого метода.
0
Ksenia Volkova Java Developer в DXC Master
28 ноября 2019, 09:30
Ошибка вылезает из-за того, что ты изменяешь коллекцию в процессе перебора ее элементов (цикл 30-35).
0
Sunshine
28 ноября 2019, 09:34
Думал об этом. Как это можно пофиксить ?
0
Ksenia Volkova Java Developer в DXC Master
28 ноября 2019, 09:39
Вопрос даже не в том, как это пофиксить, а в том зачем ты это делаешь.
У тебя в сете хранятся все значения из мапы.
Значит, условие if (unique.contains(a)) всегда будет true.
Ты хочешь удалить все записи?
Твоя цель - найти не уникальные значения, а повторяющиеся. Тогда ты их сможешь использовать в методе removeItemFromMapByValue()
0
Sunshine
28 ноября 2019, 09:43
Да, об этом не подумал, к сожалению. Сейчас решаю при помощи двух списков но там не дает пройти 3й пункт валидатор
0