gpt4 book ai didi

java - ArrayList.remove() 的意外行为

转载 作者:行者123 更新时间:2023-12-01 17:16:16 24 4
gpt4 key购买 nike

我有一个披萨代码,它遍历对象列表并检查它们是否发生碰撞。如果其中一个发生碰撞,则会将其从 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 中删除对象的情况。

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

最佳答案

我怀疑问题在于您在一次调用删除后跳过了一个元素,因为您正在递增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();
    }
    }

关于java - ArrayList.remove() 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21930817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com