Java:从不同的ArrayLists中同时删除两个对象

时间:2016-03-25 16:44:08

标签: java arraylist concurrentmodification

我有对象Bullet我一次添加到两个ArrayLists,下面简要介绍这些列表。完成某些操作后,我希望从两个列表中删除子弹。这种方法是否正确?我继续收到错误:java.util.ConcurrentModificationException

或者,为了以这种方式处理对象,你能想到比ArrayList更好的解决方案吗?

    //there are ArrayList<Bullet> bullets and ArrayList<Updatable> updatable, in the class

    public void removeBullet(Bullet bullet) {

    for (ListIterator<Bullet> bulletIterator = bullets.listIterator(); bulletIterator.hasNext();) {

        Bullet tempBullet = bulletIterator.next();

        if (tempBullet.equals(bullet)) {

            for (ListIterator<Updatable> updatableIterator = updatable.listIterator(); updatableIterator.hasNext();) {

                Updatable tempUpdatable = updatableIterator.next();
                if (tempUpdatable.equals(bullet)) {

                    updatableIterator.remove();
                    bulletIterator.remove();
                    return;

                }
            }
        }
    }

}

编辑:问题的根源是我在其中一个列表上使用了一个迭代器,同时在不同的地方使用了迭代器,因此出现了错误。此代码适用于可更新列表。

2 个答案:

答案 0 :(得分:3)

发生ConcurrentModificationException是因为您试图从Iterator中删除一个子弹,您也在for循环中同时迭代它; java不喜欢你这样做并抛出异常。

要解决此问题,您必须遍历两个迭代器并单独删除它们,或者,如rdonuk所述,只需使用ArrayList remove()方法,如果您尝试删除某些内容,则不会抛出任何异常不在ArrayList中;如果删除了对象,它将返回true,否则返回false,因此您甚至不必检查要删除的对象是否首先包含在ArrayList中。

答案 1 :(得分:2)

只需使用ArrayList删除方法。

bullets.remove(bullet);

updatable.remove(bullet);

修改

删除ArrayList使用的迭代器方法:

    public void remove() {
        if (lastRet < 0)
            throw new IllegalStateException();
        checkForComodification();

        try {
            ArrayList.this.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }

如您所见,它已经使用ArrayList.remove()方法。