删除 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”,并且应使用 Set 来跟踪使用的名称。 @JB 所说的...或usedNames.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 中的重复对象会导致并发修改错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中如何从ArrayList中删除重复对象

如何从java arraylist中删除重复的对象[重复]

Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

Java - 删除 ArrayList 中的重复项

java List去除重复数据的五种方式

C#ArrayList重复数据删除