Странно, вроде все последовательно, но целевые элементы не удаляются. Прошу помочь.
P.S. Видел, что есть совсем другой способ решения - через игру с датами. Но пока мне интересно разобраться с представленным способом.
package com.javarush.task.jdk13.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("Сталлоне2", dateFormat.parse("MAY 2 2012"));
map.put("Сталлоне3", dateFormat.parse("MAY 3 2012"));
map.put("Сталлоне4", dateFormat.parse("JULY 4 2012"));
map.put("Сталлоне5", dateFormat.parse("JULY 5 2012"));
map.put("Сталлоне6", dateFormat.parse("JULY 6 2012"));
map.put("Сталлоне7", dateFormat.parse("MAY 7 2012"));
map.put("Сталлоне8", dateFormat.parse("MAY 8 2012"));
map.put("Сталлоне9", dateFormat.parse("MAY 9 2012"));
map.put("Сталлоне10", dateFormat.parse("MAY 10 2012"));
return map;
}
public static void removeAllSummerPeople(Map<String, Date> map) {
for (String str : map.keySet()) {
Date date = map.get(str);
String dat = date.toString();
if (dat.contains("JULY") || dat.contains("JUNE") || dat.contains("AUGUST")) {
map.remove(str);
}
}
}
public static void main(String[] args) throws ParseException {
// Map<String, Date> map = createMap();
// removeAllSummerPeople(map);
// System.out.println(map);
}
}
str : map.keySet(), то в цикле нельзя использоватьmap.removeДлинное объяснение: В цикле foreach создаётся анонимный итератор, перечень элементов коллекции, которую цикл перебирает. Если коллекция изменяется (элемент удаляется или добавляется), то составленный перечень перестаёт соответствовать коллекции, машина на это обижается. Воркэраунд: Можно создать итератор вручную, с именем, цикл запустить по этому итератору и удалять не map.remove, а iterator.remove. В этом случае удаление происходит и из перечня, и из коллекции, соответствие не нарушается. Другой вариант похуже - создать копию коллекции и крутить цикл по копии, а вот удалять из оригинала.