![](/img/trans.png)
[英]java.util.ConcurrentModificationException when removing elements from a hashmap
[英]Removing elements from a Hashmap
从 HashMap 中删除元素
我需要在 HashMap 中添加 10 个元素; 姓名和出生日期。
removeAllSummerPeople 应该删除所有在六月、七月或八月出生的人。
非常不清楚需要做什么。
public static HashMap<String, Date> createMap() throws ParseException {
DateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
HashMap<String, Date> map = new HashMap<String, Date>();
map.put("Stallone", df.parse("JUNE 1 1980"));
//write your code here
map.put("a", df.parse("JUNE 1 1980"));
map.put("b", df.parse("JUNE 1 1980"));
map.put("c", df.parse("JUNE 1 1980"));
map.put("d", df.parse("JUNE 1 1980"));
map.put("e", df.parse("JUNE 1 1980"));
map.put("f", df.parse("JUNE 1 1980"));
map.put("g", df.parse("JUNE 1 1980"));
map.put("h", df.parse("JUNE 1 1980"));
map.put("i", df.parse("JUNE 1 1980"));
return map;
}
public static void removeAllSummerPeople(HashMap<String, Date> map) {
//write your code here
for(HashMap.Entry<String, Date> pair : map.entrySet()){
int x = pair.getValue().getMonth();
if (x>=6 && x<=8){
map.remove(pair.getKey());
}
}
}
它闻起来像家庭作业,所以我帮了你一个忙,不要为你把它解决成完整的代码。
如果您被允许进入 class,我建议:
Date
class 并使用LocalDate
作为生日。 LocalDate
来自 java.time,现代 Java 日期和时间 API,在这里代表一个没有时间的日期,这似乎是你需要的。 要初始化 map 值of
请使用工厂方法,例如LocalDate.of(1980, Month.JUNE, 1)
。Map.values()
to get a collection view unto the collection of values of the map, then use the removeIf
method of the收集视图以删除那些月份内的日期。 这将依次从 map 中删除相应的条目。 它要求您可以编写 lambda 作为参数传递给removeIf
。Date
class。 它总是设计得很糟糕,现在已经过时了。 请改用LocalDate
。Date
,也不要使用它的getMonth
方法。 这种方法已经被弃用了几十年(字面意思),因为它跨时区工作不可靠。 相比之下, LocalDate
的getMonth
方法运行良好且可靠。Date
class 非常不自然地从 1 月的 0 到 12 月的 11 对月份进行编号,这就是为什么您的代码没有尝试删除任何条目的原因。 相比之下LocalDate.getMonth()
返回一个Month
枚举常量,如Month.JUNE
,因此几乎不会混淆含义。for
循环中删除 map 条目将不起作用。 它会抛出java.util.ConcurrentModificationException
(大多数时候)(只是因为您的代码没有尝试删除任何条目,所以您没有收到此异常)。 如果您不能使用上面提到的removeIf
,请尝试使用Iterator
及其remove
方法。首先,getMonth 是从零开始的。 意思是一月是零,十二月是 11。当你使用 foreach 时,你不能从 map 中删除第二个。 你必须改变你的代码是这样的:
public class BirthdayTest {
public static void main(String[] args) throws ParseException {
BirthdayTest b = new BirthdayTest();
Map map = createMap();
removeAllSummerPeople(map);
}
public static HashMap<String, Date> createMap() throws ParseException {
DateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
HashMap<String, Date> map = new HashMap<String, Date>();
map.put("Stallone", df.parse("JUNE 1 1980"));
//write your code here
map.put("a", df.parse("JUNE 1 1980"));
map.put("b", df.parse("JUNE 1 1980"));
map.put("c", df.parse("JUNE 1 1980"));
map.put("d", df.parse("JUNE 1 1980"));
map.put("e", df.parse("JUNE 1 1980"));
map.put("f", df.parse("JUNE 1 1980"));
map.put("g", df.parse("JUNE 1 1980"));
map.put("h", df.parse("JUNE 1 1980"));
map.put("i", df.parse("JUNE 1 1980"));
return map;
}
public static void removeAllSummerPeople(Map<String, Date> map) {
Set<String> tobeDeleted = new HashSet<>();
//write your code here
for (HashMap.Entry<String, Date> pair : map.entrySet()) {
int x = pair.getValue().getMonth() + 1;
if (x >= 6 && x <= 8) {
tobeDeleted.add(pair.getKey());
}
}
for (String str : tobeDeleted)
map.remove(str);
}
}
所有的废话。 您在尝试从您正在迭代的 object map 中删除密钥时犯了一个主要错误。 您必须首先为要删除的 object map 创建一个副本,然后遍历该副本。 对于日期 stuf 将其放入 String 变量中并检查是否包含您要查找的月份并将其删除。 无需在方法签名日期更改任何内容。 不要作弊 做研究 不要复制其他解决方案 与你得到的东西一起工作并让它发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.