【问题标题】:Remove element from ArrayList using ListIterator in loop inside loop在循环内循环中使用 ListIterator 从 ArrayList 中删除元素
【发布时间】:2015-10-06 12:46:27
【问题描述】:

我的要求是像这样从 ArrayList 中删除:

ArrayList<User> user = new ArrayList<User>();

ListIterator<User> outerIterator = null;
ListIterator<User> innerIterator = null;

User outer = null;
User inner = null;

for(outerIterator = user.listIterator(); outerIterator.hasNext();) {
    outer = outerIterator.next();
    for(innerIterator = user.listIterator(); innerIterator.hasNext();) {
        inner = innerIterator.next();
        if(SomeOperationOn(outer,inner)) {
            innerIterator.remove();
        }
    }
}

上面的代码给出异常

Exception in thread "main" java.util.ConcurrentModificationException

正如预期的那样,因为我试图从 innerIterator 中删除,而 outerIterator 是同一对象(用户)上的 Iterator。

有没有办法在循环内循环中使用 ListIterator 从 ArrayList 中删除元素?

【问题讨论】:

  • 即使你解析了ConcurrentModificationException,由于调用了outerIterator.remove(),你的ArrayList在这段代码的末尾也会是空的。这是你想要的吗?
  • outerIterator.remove() 我只是用来检查的,但是是的,在循环列表的末尾会是空的。
  • 那为什么不简单地声明一个新的相同大小的空列表呢? (或重新初始化这个?)
  • 您可以做的就是使用另一个列表来维护要删除的元素列表并在最后删除它们。
  • 然后请编辑您的问题以删除该行;它改变了代码的全部用途。

标签: java arraylist collections iterator listiterator


【解决方案1】:

单独地,在Iterator 上调用remove() 是在从您正在迭代的集合中删除项目时避免ConcurrentModificationException 的正确方法。但是,您有 两个 Iterators 迭代相同的 ArrayList。当您在 innerIterator 上调用 remove() 时,outerIterator 注意到列表已更改,并抛出 ConcurrentModificationException

在这种情况下,如果SomeOperationOn 表示需要删除该项目,则不要立即删除它,而是将inner 存储在稍后要删除的项目的临时List 中。在迭代器上的for 循环完成后,调用removeAll 传递这个临时列表。

【讨论】:

    猜你喜欢
    • 2020-06-02
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2012-05-31
    • 2020-02-13
    • 2021-07-04
    相关资源
    最近更新 更多