package com.javarush.task.task08.task0816;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/*
Добрая Зинаида и летние каникулы
*/
public class Solution {
public static Map<String, Date> createMap() throws ParseException {
DateFormat dateFormat = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
Map<String, Date> map = new HashMap<>();
map.put("Смирнов", dateFormat.parse("MAY 1 2012"));
map.put("Иванов", dateFormat.parse("JUNE 30 2012"));
map.put("Петрарка", dateFormat.parse("AUGUST 13 2012"));
map.put("Кучкин", dateFormat.parse("OCTOBER 22 2012"));
map.put("Ручкин", dateFormat.parse("MAY 13 2012"));
map.put("Пучкин", dateFormat.parse("OCTOBER 16 2012"));
map.put("Сучкин", dateFormat.parse("OCTOBER 3 2012"));
map.put("Кучин", dateFormat.parse("AUGUST 5 2012"));
map.put("Сукча", dateFormat.parse("SEPTEMBER 9 2012"));
map.put("Сучка", dateFormat.parse("OCTOBER 12 2012"));
return map;
//напишите тут ваш код
}
public static void removeAllSummerPeople(Map<String, Date> map) {
for (Map.Entry<String, Date> pair : map.entrySet()){
String key = pair.getKey();
Date val = pair.getValue();
if (val.getMonth()>4 && val.getMonth()<8){
map.remove(key);
}
}
//напишите тут ваш код
}
public static void main(String[] args) throws ParseException {
Map<String, Date> map = createMap();
removeAllSummerPeople(map);
System.out.println("Фамилия : Дата рождения");
for (Map.Entry<String, Date> pair : map.entrySet()){
String key = pair.getKey();
Date val = pair.getValue();
System.out.println(key + " : " + val);
}
}
}
Выкидывает вот такую ошибку:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1584)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1617)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1615)
at com.javarush.task.task08.task0816.Solution.removeAllSummerPeople(Solution.java:34)
at com.javarush.task.task08.task0816.Solution.main(Solution.java:49)Тоник
15 уровень
Помогите разобраться, почему ошибку выкидывает?
Решен
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ГоффMaster
11 декабря 2020, 07:58
Вот такие строки:
for (Map.Entry<String, Date> pair : map.entrySet())
map.remove(key);
Не совместимы друг с другом.
При использование цикла for each в бэкграунде создаётся итератор - перечень элементов, по которому этот цикл и проходит. Когда ты из списка удаляешь элемент, перечень перестаёт соответствовать самому списку, машина таких неопределённостей не любит и обижается вот такой ошибкой.
Есть два основных способа удалять элементы в цикле форыч.
("Взрослый") Самому явно создать итератор и удалять из мапы не map.revove, а iterator.remove. Метод итератора удаляет одновременно и из мапы, и из перечня, соответствие не нарушается.
("Детский") Второй способ - создаёшь копию коллекции, цикл запускаешь на копии, удаляешь из оргинала. Копия не изменяется, её соответствие перечню не нарушается.
+4
Тоникремонт мобильной техники в FixiT-сервис
11 декабря 2020, 08:06
О, спасибо! Всё становится на свои места)
+1