2016-04-15 50 views
0

我正在嘗試迭代兩個ArrayList:其中一個名爲「gegner」的是關於enemys的列表,另一個名爲「waende」是關於牆。在2維數組中迭代兩個ArrayLists

每當牆壁和敵人接觸時,兩者都應該失去一個耐久性/健康。 因爲它沒有在同一時間工作,我創建了一個新的方法,應該從列表中刪除死亡對象。

我的想法是:

public void removeDeathObjects() { 
    Wand tempW; 
    Gegner tempG; 
    for (Iterator<Gegner> it = gegner.iterator(); it.hasNext();) { 
     tempG = it.next(); 
     for (Iterator<Wand> it2 = waende.iterator(); it2.hasNext();) { 
      tempW = it2.next(); 

       if(tempW.isDestroyed()){ 
        it2.remove(); 
       } 
       if (tempG.isDeath()){ 
        it.remove(); 
       } 
     } 

    } 
} 

但程序「在線程異常‘拋出一個AWT-EventQueue的 - 0’的行it.remove() java.lang.IllegalStateException」只要有至少兩堵牆,並且這些敵人不會完全喪生。

我哪裏失敗了?

如果你想,我可以給你整個代碼,但它很長._。

PS:抱歉壞英語

+0

我不明白爲什麼你的兩個循環是嵌套的。難道你不想像'gegner.removeIf(g - > g.isDeath())'這樣的東西嗎? –

回答

1

你的錯誤是,你嵌套兩個完全獨立的迴路。看看你的代碼,顯然waende上的內循環與gegner上的外循環無關:你在waende上的動作不取決於對gegner的任何檢查。當tempG.isDeath()爲真時,it.remove()重複執行,waende中的每個Wand會發生什麼情況。迭代器的第一次移除成功,但第二次失敗。

你需要做的是兩個迴路分開:

public void removeDeathObjects() { 
    Wand tempW; 
    Gegner tempG; 
    for (Iterator<Gegner> it = gegner.iterator(); it.hasNext();) { 
     tempG = it.next(); 
     if (tempG.isDeath()){ 
      it.remove(); 
     } 
    } 
    for (Iterator<Wand> it2 = waende.iterator(); it2.hasNext();) { 
     tempW = it2.next(); 
     if(tempW.isDestroyed()){ 
      it2.remove(); 
     } 
    } 
} 
+0

你已經交換了兩個'if'塊。 ;-)解決這個問題,你有我的投票權。也可以直接在'for'循環中放置'tempG = it.next()'和'tempW = it2.next()'。 –

+0

@JulienLopez Bah!感謝您指出我的錯誤!至於'for'循環的變化,我喜歡儘可能少地觸及問題的代碼,只是爲了更清楚我想說的內容。 – vagelis

+0

夠公平的! :-) –