2016-03-25 106 views
1

我有一個對象Bullet,我一次添加到兩個ArrayList中,下面簡要介紹這些列表。完成某些操作後,我希望從兩個列表中刪除一個項目符號。這種方法是否正確?我一直在得到一個錯誤:java.util.ConcurrentModificationExceptionJava:同時從不同ArrayList中刪除兩個對象

另外,你可以想出一個比ArrayList更好的解決方案,以便以這種方式處理對象?

//there are ArrayList<Bullet> bullets and ArrayList<Updatable> updatable, in the class 

    public void removeBullet(Bullet bullet) { 

    for (ListIterator<Bullet> bulletIterator = bullets.listIterator(); bulletIterator.hasNext();) { 

     Bullet tempBullet = bulletIterator.next(); 

     if (tempBullet.equals(bullet)) { 

      for (ListIterator<Updatable> updatableIterator = updatable.listIterator(); updatableIterator.hasNext();) { 

       Updatable tempUpdatable = updatableIterator.next(); 
       if (tempUpdatable.equals(bullet)) { 

        updatableIterator.remove(); 
        bulletIterator.remove(); 
        return; 

       } 
      } 
     } 
    } 

} 

編輯:的問題源是我在不同的地方使用的迭代器的列表中的一個,在確切的同時,因此而錯誤。此代碼適用於可更新列表。

+0

你也可以使用比較器類。 –

回答

3

ConcurrentModificationException發生是因爲您試圖從Iterator中刪除項目符號,而您也在迭代中同時執行for循環;當你這樣做時,java不會喜歡並拋出異常。

爲了解決這個問題,你必須遍歷兩個迭代器並單獨刪除它們,或者,如rdonuk所述,只需使用ArrayList remove()方法,如果嘗試刪除不是任何異常在ArrayList中;如果刪除了對象,它將返回true,否則返回false,因此您甚至不必檢查要刪除的對象是否首先包含在ArrayList中。

2

只需使用ArrayList刪除方法。

bullets.remove(bullet); 

updatable.remove(bullet); 

編輯:其使用ArrayList迭代

remove方法:

public void remove() { 
     if (lastRet < 0) 
      throw new IllegalStateException(); 
     checkForComodification(); 

     try { 
      ArrayList.this.remove(lastRet); 
      cursor = lastRet; 
      lastRet = -1; 
      expectedModCount = modCount; 
     } catch (IndexOutOfBoundsException ex) { 
      throw new ConcurrentModificationException(); 
     } 
    } 

正如你看到它已經使用ArrayList.remove()方法。

+0

是否可以安全刪除列表元素低谷lists.remove而不是使用迭代器? – Zerg

+0

@Zerg如果元素只在數組中存在一次,那麼沒有區別。 –

相關問題