删除 Java ArrayList 中的重复对象会导致并发修改错误 [重复]
Posted
技术标签:
【中文标题】删除 Java ArrayList 中的重复对象会导致并发修改错误 [重复]【英文标题】:Removing duplicate objects in a Java ArrayList causes concurrent modification error [duplicate] 【发布时间】:2012-05-25 07:38:08 【问题描述】:可能重复:Concurrent Modification Exception : adding to an ArrayList
我正在尝试使用此方法从数组列表中删除重复值:
public void hasDuplicates(List<Artifact> p_cars)
final List<String> usedNames = new ArrayList<String>();
for (Artifact car : p_cars)
final String name = car.getObjectId();
if (usedNames.contains(name))
p_cars.remove(car);
usedNames.add(name);
如何在不同时修改数组列表的情况下删除这些重复值?
如果对上下文有帮助,我会在填充列表视图的数组列表上执行此操作。
谢谢!
【问题讨论】:
旁注:该方法应命名为“removeDuplicates”,并且应使用 SetusedNames.add(name)
应该在else
块中。
@Dilum:将它放在 else 块中仍然会导致 O(n) 查找,而不是使用 HashSet 的 O(1)。 Set 是唯一值的自然选择。
【参考方案1】:
在迭代集合时不能修改集合。唯一的例外是使用迭代器的 remove 方法:
public void hasDuplicates(List<Artifact> p_cars)
final List<String> usedNames = new ArrayList<String>();
Iterator<Artifact> it = p_cars.iterator();
while (it.hasNext())
Artifact car = it.next();
final String name = car.getObjectId();
if (usedNames.contains(name))
it.remove();
else
usedNames.add(name);
【讨论】:
这是修改您正在迭代的集合的正确方法。但是,对于这个用例,我们需要知道 p_cars 有多大,以及预期有多少重复。以上是关于删除 Java ArrayList 中的重复对象会导致并发修改错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章