我有一个披萨代码,它遍历一个对象列表并检查它们是否发生碰撞。如果一个与之相撞,则将其从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中删除对象不会发生。
如果我关闭应用程序,然后将其从最近的应用程序列表中删除,则可以正常运行。如果我使用主页键或后退按钮退出然后立即重新打开,则有时无法删除该对象。我不明白为什么会这样,因为其他一切仍然有效。它之前的两行代码运行得很好。我只是不明白。
答案 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();
}
}