Sie Indizierung mit einem Iterator vermeiden können; Dies funktioniert für jede Iterable, nicht nur eine Liste. Nur einen Iterator bekommen und es zweimal pro Schleife erhöhen Iteration:
List<String> strings = Arrays.asList("item 1", "item 2", "item 3", "item 4");
Iterator<String> stringsIterator = strings.iterator();
while (stringsIterator.hasNext()) {
String first = stringsIterator.next();
String second = stringsIterator.next();
System.out.println("First [" + first + "] - Second [" + second + "]");
}
Dies setzt voraus, eine Liste von gleicher Länge und wirft NoSuchElementException
am letzten Pass, wenn sie ungerade Länge ist. Sie können dies auf verschiedene Weise handhaben:
- eine
try
verwenden - catch
;
- haben eine Wächterklausel, die überprüft, dass die Länge gerade vorher ist;
- überprüfen, bevor Sie das zweite Element erhalten.
Überprüfen des zweiten Elements:
List<String> strings = Arrays.asList("item 1", "item 2", "item 3");
Iterator<String> stringsIterator = strings.iterator();
while (stringsIterator.hasNext()) {
String first = stringsIterator.next();
String second = stringIterator.hasNext() ? stringIterator.next() : null;
System.out.println("First [" + first + "] - Second [" + second + "]");
}
Iteratoren einige Leute verwirren, so dass Sie auch eine für-jede Schleife mit einem Zweig und einem Hilfs Flip-Flop-Variable für die Parität verwenden können. Dies ist viel schlimmer, da es die Logik der Schleife viel komplizierter macht, um die Iteration zu vereinfachen: anstatt die Aktion einmal pro Durchgang durch die Schleife nacheinander und ohne Verzweigung durchzuführen, müssen Sie sie stattdessen zweimal durchlaufen und mental verzweigen. Beachten Sie, dass dies das letzte Element überspringt, wenn es eine ungerade Länge hat; könnte nachträglich eine Überprüfung von isFirst
hinzufügen, wenn auch diese Fälle behandelt werden sollen.
List<String> strings = Arrays.asList("item 1", "item 2", "item 3", "item 4");
boolean isFirst = true;
String first = null;
String second = null;
for (String string : strings) {
if (isFirst) {
first = string;
isFirst = false;
} else {
second = string;
isFirst = true;
System.out.println("First [" + first + "] - Second [" + second + "]");
}
}
Schließlich beachten Sie, dass alle diese Iteratoren und Hilfsgrößen haben überschüssigen Umfang (sie nur dann von Nutzen für die Schleife selbst sind, so dass sie verschmutzen die lokale Umgebung): sie in Blöcken eingewickelt werden, um den Umfang zu begrenzen, obwohl in der Regel wird die resultierende Verschachtelung schlechter angesehen als der Überschuss -umfang:
List<String> strings = Arrays.asList("item 1", "item 2", "item 3", "item 4");
{
Iterator<String> stringsIterator = strings.iterator();
while (stringsIterator.hasNext()) {
String first = stringsIterator.next();
String second = stringsIterator.next();
System.out.println("First [" + first + "] - Second [" + second + "]");
}
}
kann das nicht außerhalb der Grenzen gehen? – CQM
@CQM Wenn es eine ungerade Anzahl von Elementen gibt, dann ja. Um das zu vermeiden, verwenden Sie 'int validSize = string.size() & ~1; 'und verwenden Sie diese in einer Schleife. – hyde