2016-04-15 14 views
0

2つのArrayListを反復しようとしています:それらのうちの1つ「gegner」は敵についてのリストであり、もう1つは「waende」という壁です。2次元配列のように2つのArrayListを反復する

壁と敵の接触があるときは、どちらも耐久性/健康を失うはずです。 同時に動作しなかったので、リストから死のオブジェクトを削除する新しい方法を作成しました。

私の考えでした:

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(); 
       } 
     } 

    } 
} 

しかし、プログラムは、すぐに、少なくとも二つの壁があるとして「ラインit.remove() java.lang.IllegalStateExceptionで 『AWT-EventQueueの-0』スレッドで例外を」スロー、enimiesは完全に殺されません。

どこで失敗しましたか?

あなたが望むなら、私はあなたにコード全体を与えることができましたが、かなり長いです。

PS:悪い英語のため申し訳ありません

+0

2つのループがネストされている理由はありません。 'gegner.removeIf(g-> g.isDeath())'のようなものは欲しくないのですか? –

答えて

1

あなたの間違いは、あなたが完全に独立した2つのループを入れ子にしているということです。あなたのコードを見ると、waendeの内側ループはgegnerの外側ループとは無関係であることが明らかです。waendeのあなたのアクションは、gegnerのチェックに依存しません。何が起こるかは、tempG.isDeath()が真の場合、it.remove()Wandのすべてに対して、waendeで繰り返し実行されます。イテレータの最初の削除は成功しますが、2番目の削除は失敗します。あなたがする必要がどのような

は、二つのループを分離することである。

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

2つの 'if'ブロックを入れ替えました。 ;-)これを修正すれば、あなたは私の上書を持っています。また、 'for'ループに' tempG = it.next() 'と' tempW = it2.next() 'を直接入れることもできます。 –

+0

@JulienLopez Bah!私の間違いを指摘してくれてありがとう! 'for 'ループの変更については、私が言うことをもっと明確にするために、できるだけ質問のコードに触れたい。 – vagelis

+0

十分なフェア! :-) –

1

あなたの答えはここにある:http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--

はIllegalStateException - nextメソッドがまだ呼び出されていない場合、または削除メソッドは、次のメソッドへの最後の呼び出しの後に既に呼び出されています

Javaの8で手動で反復する代わりに: