2016-03-25 30 views
1

Nesnelerim var İki kez Birden çok Ekleme listesi eklediğim Bullet, listeler aşağıda kısaca açıklanmıştır. Belirli işlemler yapıldıktan sonra iki listeden de bir mermi çıkarmak istiyorum. Bu yaklaşım doğru mu? Bir hata almaya devam ediyorum: java.util.ConcurrentModificationExceptionJava: Farklı nesnelerden aynı anda iki nesneyi kaldırmak

Alternatif olarak, bu şekilde nesneleri ele almak amacıyla ArrayList'den daha iyi bir çözüm düşünebilir misiniz?

//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; 

       } 
      } 
     } 
    } 

} 

DÜZENLEME: sorun kaynağı I farklı bir yerde tam olarak aynı zamanda, listeler birinde dolayısıyla hata bir yineleyici kullanılır oldu. Bu kod, güncellenebilir liste için iyi çalıştı.

+0

Karşılaştırıcı sınıflarını da kullanabilirsiniz. –

cevap

3

Bir ConcurrentModificationException, bir döngü içinde aynı zamanda yineleme yaptığınız bir yineleyiciden bir mermiyi kaldırmaya çalıştığınız için olur; java bunu yaptığınızda hoşlanmaz ve istisna atar.

Bunu çözmek için, her iki yineleyiciden yinelemeniz ve bunları ayrı ayrı kaldırmanız gerekir veya rdonuk'un belirttiği gibi yalnızca ArrayList remove() yöntemini kullanmanız gerekir; ArrayList içinde; Nesne kaldırılmışsa true veya aksi halde false döndürecektir, böylece kaldırmak istediğiniz nesnenin ilk olarak ArrayList'te bulunup bulunmadığını kontrol etmeniz gerekmez.

2

Yalnızca ArrayList kaldırma yöntemini kullanın.

bullets.remove(bullet); 

ve

updatable.remove(bullet); 

Düzenleme: ArrayList kullandığı yineleyici

kaldır yöntemi: Zaten ArrayList.remove() yöntemi kullanmak görmek üzere

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

Yineleyiciler kullanmak yerine arraylist öğelerini lists.remove kaldırmak güvenli midir? – Zerg

+0

@Zerg Eğer eleman dizide sadece bir kez mevcutsa, o zaman fark yoktur. –

İlgili konular