是否可以在迭代时覆盖一些 HashSet 元素(不一定是迭代的那个)。我想知道除了删除、编辑然后重新添加之外的方法吗?
我问这个的原因是因为在迭代时使用 remove 总是会产生 java.util.ConcurrentModificationException。我发现没有方法可以覆盖集合元素。

任何帮助将不胜感激。

谢谢,

索姆纳特

请您参考如下方法:

您可以从 Collection 中删除项目- 包括 Set - 只要您使用 Iterator 对其进行迭代,就对其进行迭代并调用 Itertator.remove() 做删除。但是,这只允许您删除迭代中的当前项目。

您不能删除另一项或添加一项,因为这将导致 ConcurrentModificationException , 因为如果你改变 Set目前尚不清楚您将如何迭代它。

此外,不像 List , 谈论替换 Set 中的条目是没有意义的.在 List项目具有定义顺序,例如,如果第二个条目是“A”,您可以将其替换为“B”。 Set 中的项目没有订单所以你不能直接用另一个替换一个,你所能做的就是删除旧的并添加新的。

完全取决于您想要做什么,您最好的方法可能是遍历 Set 的副本。 :

Set<Object> originalSet = someMethod();  
 
for (Object item : new HashSet<Object>(originalSet)) { 
  //do stuff which modifies originalSet 
} 

但是,您必须考虑这样一个事实,即您迭代的对象将是原始值,并且不会反射(reflect)您所做的任何更改。

如果这样做不行,那么寻找另一种处理 Set 中的项目的方法可能是有意义的。无需通过跟踪您已处理的节点来简单地迭代它们。

像这样的事情可能会做,但可能会根据你正在做的事情得到改进:
Set<Object> originalSet = somemethod(); 
 
//Keep track of items we've already processed 
Set<Object> processed = new HashSet<Object>(); 
 
//toDo is used to calculate which items in originalSet aren't in processed 
Set<Object> toDo = new HashSet(originalSet); 
toDo.removeAll(processed); 
 
while (! toDo.isEmpty()) { 
  //Get an object from toDo 
  Object item = toDo.iterator().next(); 
 
  //Do some processing 
  //Can update originalSet or even remove from processed if we want to re-do an item 
 
  //Recalculate what's left to do 
  processed.add(item); 
  toDo = new HashSet(originalSet); 
  toDo.removeAll(processed); 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!