Был код по задаче Добрая Зинаида и летние каникулы:
package com.example.helloworld;
import java.io.*;
import java.util.*;
import java.text.*;
public class HelloWorld {
public static HashMap<String, Date> createMap() throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
HashMap<String, Date> map = new HashMap<String, Date>();
map.put("Stallone", df.parse("JUNE 1 1980"));
map.put("Vlad", df.parse("JUNE 1 2980"));
map.put("Kola", df.parse("MARCH 1 1980"));
map.put("Vasa", df.parse("OCTOBER 1 1980"));
map.put("Peta", df.parse("JULY 1 1980"));
map.put("Eva", df.parse("AUGUST 1 1980"));
map.put("Adam", df.parse("SEPTEMBER 1 1980"));
map.put("Iisus", df.parse("MAY 1 1980"));
map.put("Satana", df.parse("FEBRUARY 1 1980"));
map.put("Jopqa", df.parse("JANUARY 1 1980"));
return map;
}
public static void removeAllSummerPeople(HashMap<String, Date> map) {
SimpleDateFormat df = new SimpleDateFormat("MM", Locale.ENGLISH);
try {
for (Map.Entry<String, Date> pair : createMap().entrySet()) {
int a = map.get(pair.getKey()).getMonth();
if (a>4&&a<8) {
map.remove(pair.getKey());
}
}
} catch (ParseException t) {
}
}
public static void main(String[] args) {
SimpleDateFormat df = new SimpleDateFormat("MM", Locale.ENGLISH);
try {
HashMap<String, Date> map = createMap();
removeAllSummerPeople(map);
for (Map.Entry<String, Date> pair : map.entrySet()) {
System.out.println(pair.getKey()+""+pair.getValue());
}
} catch (ParseException t) {
}
}
}
и не проъодтло условие Метод removeAllSummerPeople() должен удалять из словаря всех людей, родившихся летом.
Сменил на код :
package com.javarush.task.task08.task0816;
import java.io.*;
import java.util.*;
import java.text.*;
/*
Добрая Зинаида и летние каникулы
*/
public class Solution {
public static HashMap<String, Date> createMap() throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
HashMap<String, Date> map = new HashMap<String, Date>();
map.put("Stallone", df.parse("JUNE 1 1980"));
map.put("Vlad", df.parse("JUNE 1 2980"));
map.put("Kola", df.parse("MARCH 1 1980"));
map.put("Vasa", df.parse("OCTOBER 1 1980"));
map.put("Peta", df.parse("JULY 1 1980"));
map.put("Eva", df.parse("AUGUST 1 1980"));
map.put("Adam", df.parse("SEPTEMBER 1 1980"));
map.put("Iisus", df.parse("MAY 1 1980"));
map.put("Satana", df.parse("FEBRUARY 1 1980"));
map.put("Jopqa", df.parse("JANUARY 1 1980"));
return map;
}
public static void removeAllSummerPeople(HashMap<String, Date> map) {
SimpleDateFormat df = new SimpleDateFormat("MM", Locale.ENGLISH);
Iterator <Map.Entry <String , Date>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,Date> a = iterator.next();
if (a.getValue().getMonth()>4 && a.getValue().getMonth()<8){
iterator.remove();
}
}
}
public static void main(String[] args) {
}
}
и заработало, то есть фактически сменил часть цикла с помощью итератора а не укороченой версии и удалял не map.rebove а iterator.remove.
Так вот, в чем разница между map.rebove и iterator.remove?
Влад
22 уровень
В чем различие?
Решен
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
5 марта 2019, 11:39решение
Нельзя удалять из мапы, перебирая ее циклом for-each, т.к. он не исключает возникновение исключения Concurrent Modification Exception.
https://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html:
So when should you use the for-each loop? Any time you can. It really beautifies your code. Unfortunately, you cannot use it everywhere. Consider, for example, the expurgate method. The program needs access to the iterator in order to remove the current element. The for-each loop hides the iterator, so you cannot call remove.
Подробнее объяснял тут:
https://javarush.com/help/16733
+2
Влад
5 марта 2019, 11:53
Спасибо!
0