当前位置: 首页 > 面试题库 >

迭代Map时发生ConcurrentModificationException

井宪
2023-03-14
问题内容

我下面有以下代码

Map<String, Integer> buyingItemEnumerationMap = this.toBuyItemEnumeration;
for (Entry<String, Integer> item : buyingItemEnumerationMap.entrySet()) {
   if(RandomEngine.boolChance(50)){ //will delete?
    buyingItemEnumerationMap.remove(item.getKey());
   }
   if(buyingItemEnumerationMap.size() == 1){
    break;
   }
}

现在我正在使用一个Android游戏,并且上面的代码以多线程方式运行。现在我有一个例外java.util.ConcurrentModificationException。我已经研究了如何解决问题,但似乎对我没有帮助。我在上面的代码上所做的是
随机删除一个条目 。我如何在那里实现它?


问题答案:

除非使用,否则不能在迭代时从集合中删除元素Iterator

这就是导致异常的原因。

buyingItemEnumerationMap.remove(item.getKey());

使用Iterator#remove()在遍历集合时删除元素,例如

Iterator<Map.Entry<String, Integer>> iterator = 
                           buyingItemEnumerationMap.entrySet().iterator();
while (iterator.hasNext()) {
   Map.Entry<String, Integer> item = iterator.next();
   if(RandomEngine.boolChance(50)){ //will delete?
      iterator.remove();
   }
   //..
}

编辑 :(响应OP的评论)
是的,删除完成通过Iterator#remove()Set由归国
HashMap.entrySet()
将在基本反映了Map作为Set被它的支持。在此处引用JavaDoc:

返回此映射中包含的映射的Set视图。集合由地图支持,因此对地图的 更改会反映在集合中,反之亦然



 类似资料:
  • 问题内容: 我正在编写一个递归函数,其目的是迭代pList文件。我的代码是 但是当我调用函数“ HashMapper((Map)((Map)entry).keySet());”时。我有一个例外 java.util.HashMap $ HashMap条目不能转换为java.util.Map 我不知道如何调用函数以及如何将Hashmap条目转换为Map 问题答案: 入境确实不是。它是,因此您可以根据需

  • 问题内容: 一段时间以来,我一直在努力解决此错误,而且我不知道问题出在哪里。我的代码是这样的: 它在remove调用上引发IllegalStateException。 我一直在想问题是否会出现,因为我要删除列表的最后一项,但即使在过程的中间,它似乎也会出错。 你们能给我一个解释吗? 问题答案: 您正在从内部循环内部的列表中删除一个元素。这意味着您的内部循环可能会尝试两次删除相同的元素,这将解释您遇

  • 生成器迭代 手动迭代生成器,递归执行 AsyncTask::next,调用Generator::send方法将将yield值作为yield表达式结果。 yield表达式可能是一个异步调用,我们这里为之后把异步调用的结果作为yield表达式结果铺垫。 yield外侧括号在PHP5必须,PHP7不需要。 如, $ip = (yield async_dns_lookup(...) ); ^

  • 我有一个映射,它包含日期作为键和(另一个字符串作为键和列表作为值的映射)作为值。,我想填充另一个将String作为键和double作为值的映射。FlexiServer的内容包括 因此,基本上,我想首先迭代外部映射以获得内部映射,然后迭代内部映射以获得FlexiServers列表,并填充新的映射,其中服务器号作为键,数量列表作为值。我如何使用Java8流来实现这一点呢? 我尝试使用for循环,但我希

  • 类似于同步 方式的Iterator,这里有很多不同的方法可以迭代和处理一个Stream中的值。有组合器样式的方法,例如map,filter和fold和他们的有错误就早退的表弟try_map,try_filter和try_fold。 不幸,for循环不适用于Streams,但对于命令式代码,while let和next/try_next函数可以这样用: async fn sum_with_next(

  • 本文向大家介绍Python迭代器与可迭代与生成器,包括了Python迭代器与可迭代与生成器的使用技巧和注意事项,需要的朋友参考一下 示例 一个迭代是一个对象,可以返回一个迭代器。具有状态且具有__iter__  方法并返回迭代器的任何对象都是可迭代的。也可能是没有状态的对象,该对象实现了__getitem__方法。-该方法可以获取索引(从零开始),并IndexError在索引不再有效时引发。 Py