我试图从数组列表中删除一些元素,同时像这样迭代它:

for (String str : myArrayList) {
    if (someCondition) {
        myArrayList.remove(str);
    }
}

当然,当我在迭代myArrayList的同时试图从列表中删除项时,我得到了一个ConcurrentModificationException。有没有简单的办法来解决这个问题?


当前回答

可以使用迭代器remove()函数从底层集合对象中删除对象。但在这种情况下,您可以从列表中删除同一对象,而不能删除任何其他对象。

从这里

其他回答

你必须使用迭代器的remove()方法,这意味着没有增强的for循环:

for (final Iterator iterator = myArrayList.iterator(); iterator.hasNext(); ) {
    iterator.next();
    if (someCondition) {
        iterator.remove();
    }
}

虽然其他建议的解决方案工作,如果你真的希望解决方案是线程安全的,你应该用CopyOnWriteArrayList替换ArrayList

    //List<String> s = new ArrayList<>(); //Will throw exception
    List<String> s = new CopyOnWriteArrayList<>();
    s.add("B");
    Iterator<String> it = s.iterator();
    s.add("A");

    //Below removes only "B" from List
    while (it.hasNext()) {
        s.remove(it.next());
    }
    System.out.println(s);

Java 8用户可以这样做:

    List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
    list.removeIf(e -> (someCondition));

它将删除列表中满足someCondition条件的元素

可以使用迭代器remove()函数从底层集合对象中删除对象。但在这种情况下,您可以从列表中删除同一对象,而不能删除任何其他对象。

从这里

使用迭代器并调用remove():

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
    String str = iter.next();

    if (someCondition)
        iter.remove();
}