是否可以在迭代时覆盖一些 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);
}