ArrayList.remove()的意外行为

时间:2014-02-21 09:50:54

标签: java android arraylist

我有一个披萨代码,它遍历一个对象列表并检查它们是否发生碰撞。如果一个与之相撞,则将其从ArrayList中删除。

for (int i = 0; i < arrayList.size(); i++) {
    Object c = arrayList.get(i);
    if (Rect.intersects(foo.getRect(), c.getRect())) { //Android function, checks if the two rectangles are inside each other.
        foo.setPosY(c.getPosY() + 11); // Always works.
        foo.setVelY(bird.getVelY() * -1); // Always works.
        arrayList.remove(i); // Occasionally fails under special circumcisions.
    }
}

第一次打开应用程序时,这很好用。但是,如果我退出后退按钮,然后快速重新打开应用程序,它将全部工作除了偶尔,从ArrayList中删除对象不会发生。

如果我关闭应用程序,然后将其从最近的应用程序列表中删除,则可以正常运行。如果我使用主页键或后退按钮退出然后立即重新打开,则有时无法删除该对象。我不明白为什么会这样,因为其他一切仍然有效。它之前的两行代码运行得很好。我只是不明白。

1 个答案:

答案 0 :(得分:5)

我怀疑问题是你在一次调用删除后跳过了一个元素,因为你正在递增i 列表中的所有内容都会向上移动一个元素。 (现在还不清楚症状是什么。如果这不是 问题,它仍然是 问题。)

因此,如果您致电remove(2),您现在要查看的下一个元素的索引为2。

解决此问题的常用方法:

  • 向后工作:

    for (int i = arrayList.size() - 1; i >= 0; i--)
    
  • 改为使用迭代器:

    for (Iterator<Foo> iterator = arrayList.iterator(); iterator.hasNext(); ) {
        Foo c = iterator.next();
        if (...) {
            iterator.remove();
        }
    }