2017-11-27 4 views
0

Ich möchte stattdessen mehrere verschachtelte Forloops durch verschachtelte Listeneratoren ersetzen, wollte aber wissen, ob dies ein Problem beim Aufruf von .next() wäre. Wenn ich beispielsweise Iterator attackIter = currentAttackers.iterator(); sage und einen Iterator für jede der drei Listen instanziiere, dann führe zuerst einen geschachtelten Forloop für die Listen A und B durch, und dann einen für B und C das ist ein Problem für die zweite Schleife seit ich bereits .next() den ganzen Weg bis zum Ende der Liste B angerufen habe? Die Original-Schleifen sehen irgendwie wie folgt aus:Mehrere for-Schleifen durch Listen-Iteratoren ersetzen

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

Da Ihr Code durch die 'listB' zweimal benötigen Sie zwei Iteratoren schaffen für' listB' –

Antwort

0

Wenn Sie nicht explizit zu verwenden Iterator s erforderlich, die beste Art und Weise ListIterator s zu verwenden, wie dies (AType und BType mit den entsprechenden Typen ersetzen):

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

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

Dies nutzt Iterator s hinter den Kulissen und macht die Dinge einfach. Siehe Oracle Artikel, "The For-Each Loop", aus bestimmten Gründen, warum es vorteilhaft ist, es auf diese Weise zu tun, statt Iterator s explizit zu verwenden.


Wenn Sie Iterator s explizit verwenden müssen, können Sie es tun, wie folgt (basierend auf den Beispielen in "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()); 
    } 
} 

Wie von anderen darauf hingewiesen wird, haben Sie eine neue verwenden, Iterator jedes Mal, wenn Sie eine List durchlaufen, weil eine Iterator nicht für eine andere Iteration durch eine List zurückgesetzt werden kann.

0

Ein Iterator kann nur einmal verwendet werden. Es gibt keine Methoden, um es zurückzusetzen. Jedes Mal, wenn Sie durch listB iterieren möchten, müssen Sie einen neuen Iterator erstellen.

Sie sind wirklich viel besser mit einer for-Schleife jeden oder sogar die forEach Methode:

listA.forEach(a -> listB.forEach(b -> collide(a, b))); 
Verwandte Themen