2016-03-25 16 views
1

私は2つのArrayListsに一度に追加するBulletオブジェクトを持っています。リストは以下で簡単に説明します。特定の操作が行われた後、両方のリストから箇条書きを削除したいと思います。このアプローチは正しいですか?私はエラーが発生し続ける:java.util.ConcurrentModificationExceptionJava:異なるArrayListsから2つのオブジェクトを同時に削除する

また、この方法でオブジェクトを扱う目的で、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; 

       } 
      } 
     } 
    } 

} 

EDIT:問題の原因は、私は、別の場所に正確に同じ時刻に、リストのいずれかで、したがって、エラーをイテレータを使用したことでした。このコードは、更新可能なリストでうまくいきました。

+0

でもコンパレータクラスを使用できます。 –

答えて

3

ConcurrentModificationExceptionは、forループで同時に反復処理されているイテレータから箇条書きを削除しようとしているために発生します。あなたがそれをして例外をスローするとき、javaは好きではありません。

これを解決するには、両方のイテレータを反復処理して別々に削除するか、rdonukが述べたように、単にArrayList remove()メソッドを使用します。これは、 ArrayList内にあります。オブジェクトが削除された場合はtrue、そうでない場合はfalseが返されるため、削除するオブジェクトが最初にArrayListに含まれているかどうかを確認する必要はありません。

2

ただ削除ArrayListを使用してください。

bullets.remove(bullet); 

updatable.remove(bullet); 

編集:ArrayListによって使用されるイテレータの

removeメソッド:あなたはそれがすでに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(); 
     } 
    } 

+0

イテレータを使用する代わりにリスト要素を削除することは安全ですか? – Zerg

+0

@Zerg要素が配列内に1回しか存在しない場合は、違いはありません。 –

関連する問題