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

如何在迭代时删除和添加元素到TreeMap?

平学
2023-03-14
问题内容

我想写这样的代码-

for (Map.Entry<Long, Integer> e : map.entrySet()){
    map.remove(k);
    map.put(x, value);
}

但是我也java.util.ConcurrentModificationException
尝试使用,Iterator但是我得到了相同的结果Exception


问题答案:

解释原因ConcurrentModificationException

map.remove(k);
map.put(x, value);

for-
each循环也在内部创建的迭代器entrySetmap。在遍历map时,您已经通过将值再次放入map(map.put(x,value))来修改了map的结构,这会导致这种情况ConcurrentModificationException

甚至在文档中也对此做了很好的解释-

此类的所有“集合视图方法”返回的迭代器都是快速失败的:如果在创建迭代器后的任何时间对结构进行结构修改,则除了通过迭代器自己的remove方法之外,该迭代器都将抛出ConcurrentModificationException
。因此,面对并发修改,迭代器将快速而干净地失败,而不是冒着在未来不确定的时间冒任意,不确定的行为的风险。

如何解决 -

您必须在迭代时更改此映射的结构更改,以后可以插入此值,例如保留临时映射,并在迭代完成后将其添加到主映射中。

Map<Long, Integer> tempMap = new HashMap<>();
for (Map.Entry<Long, Integer> e : map.entrySet()){
    map.remove(k);
    tempMap.put(x, value);
}
map.putAll(tempMap);


 类似资料:
  • AFAIK,有两种方法: 迭代集合的副本 使用实际集合的迭代器 例如, 而且 有没有理由偏爱一种方法而不是另一种方法(例如,由于可读性的简单原因而偏爱第一种方法)?

  • 问题内容: 我知道在迭代列表时不允许删除元素,但是在迭代时允许将元素添加到python列表中。这是一个例子: 我已经在我的代码中尝试过了,它似乎可以正常工作,但是我不知道是否是因为我很幸运,将来它会折断吗? 编辑:我不愿复制列表,因为“ myarr”很大,因此会太慢。另外,我需要使用“ somecond()”检查附加对象。 编辑:在某些时候“ somecond(a)”将为假,因此不能有无限循环。

  • 问题内容: 假设我有一个数字列表: 迭代时,如何从列表中删除元素(例如3)? 我尝试了以下代码,但没有成功: 有任何想法吗? 谢谢,博达·西多(Boda Cydo)。 问题答案: 最好的方法通常是建设性地进行-建立所需项目的新列表,而不要删除不需要的项目。例如: 列表理解建立所需的列表,并分配到“全名单切片” ,确保你 不 只是一个重新绑定的名字,但完全替换 内容 ,所以影响是恒等于你想要的“清除

  • 问题内容: 我正在尝试从这样的迭代中删除一些元素: 当然,当我尝试同时从列表中删除项目时,我会得到一个提示。有解决此问题的简单方法吗? 问题答案: 使用和致电:

  • 问题内容: 假设我有一个清单,例如: 在遍历此列表时,我想在列表末尾添加一个元素。但是我不想遍历新添加的元素,也就是我想遍历列表的初始大小。 有人可以建议我该怎么做吗? 问题答案: 您不能为此使用foreach语句。foreach在内部使用迭代器: 此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,则除了通过迭代器自己的

  • 本文向大家介绍jQuery 添加元素和删除元素的方法,包括了jQuery 添加元素和删除元素的方法的使用技巧和注意事项,需要的朋友参考一下 添加新的 HTML 内容 我们将学习用于添加新内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插