2017-11-27 18 views
0

入れ子になった複数のforloopsを入れ子の入れ子に置き換えたいが、これが.next()を呼び出すときに問題になるかどうかを知りたい。例えば、Iterator attackIter = currentAttackers.iterator();と言って、3つのリストのそれぞれに対してイテレータをインスタンス化し、次にリストAとB、そしてBとCのネストされたforloopを実行すると、それはすでにリストBの終わりまで.next()を呼び出しているので、2番目のループの問題ですか?オリジナルのループは一種の次のようになります。あなたが明示的にIterator Sを使用する必要はありませんしている場合複数のforループをリストイテレータに置き換える

for (int i = 0; i < listA.size(); i++) { 
     for (int j = 0; j < listB.size(); j++) { 
      collide(listA.get(i), listB.get(j)); 
     } 
    } 

    for (int i = 0; i < listB.size(); i++) { 
     for (int j = 0; j < listC.size(); j++) { 
      collide(listB.get(i), listC.get(j)); 
     } 
    } 
+1

'listB'は二回あなたがlistB''のための2回の反復子を作成する必要があります –

答えて

0

ListIterator Sを使用するための最良の方法は、この(適切なタイプでATypeBTypeを交換する)のようなものです:

for (AType a : listA) { 
    for (BType b : listB) { 
     collide(a, b); 
    } 
} 

for (BType b : listB) { 
    for (CType c : listC) { 
     collide(b, c); 
    } 
} 

これは、背景の背後でIteratorを使用しており、簡単なことです。 Iteratorを明示的に使用するのではなく、このようにするのが有益な理由については、Oracleの記事"The For-Each Loop"を参照してください。


あなたがIterator Sを使用する必要がある場合は、明示的に、あなたはこの("The For-Each Loop"の例に基づいて)のようにそれを行うことができます。他の人が指摘したように

for (Iterator<AType> i = listA.iterator(); i.hasNext();) { 
    AType a = i.next(); 
    for (Iterator<BType> j = listB.iterator(); j.hasNext();) 
     collide(a, j.next()); 
    } 
} 

for (Iterator<BType> i = listB.iterator(); i.hasNext();) { 
    BType b = i.next(); 
    for (Iterator<CType> j = listC.iterator(); j.hasNext();) 
     collide(b, j.next()); 
    } 
} 

、あなたは新しいを使用する必要がありますListをループするたびにIteratorが返されます。Iteratorは、Listを介して別の繰り返しでリセットすることができないためです。

0

イテレータは一度しか使用できません。それをリセットする方法はありません。 listBを反復するたびに、新しいイテレータを作成する必要があります。

あなたは本当に使用してオフにはるかに優れているため、各ループ、あるいはforEachの方法:あなたのコードの反復処理して以来

listA.forEach(a -> listB.forEach(b -> collide(a, b))); 
関連する問題