[英]Unexpected behavior with ArrayList.remove()
我有一個比薩餅代碼,它遍歷對象列表並檢查它們是否碰撞。 如果發生沖突,則將其從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中刪除對象之外 , 其他所有功能都將起作用。
如果我關閉該應用程序,然后將其從最近的應用程序列表中刪除,則它可以工作。 如果我使用Home鍵或返回按鈕退出,然后立即重新打開,則有時無法刪除該對象。 我不明白為什么會這樣,因為其他所有內容仍然有效。 之前起作用的兩行代碼就可以了。 我就是不明白。
我懷疑問題是您在刪除一次調用后就跳過了一個元素,因為您要遞增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(); } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.