簡體   English   中英

ArrayList.remove()的異常行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM