可避免與Iterator索引的解決方案;這適用於任何Iterable,而不僅僅是一個列表。剛剛得到一個迭代,每個循環迭代增加了兩遍:
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 + "]");
}
這是假設,即使長的列表,並在最後一關拋出NoSuchElementException
,如果是奇數長度。您可以通過多種方式處理:
- 使用
try
- catch
;
- 有一個保護條款,它會檢查長度是否在預先確定的範圍內;
- 獲取第二個元素之前檢查。
檢查第二個元素:
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 + "]");
}
迭代迷惑一些人,所以你也可以使用for-each循環用樹枝和奇偶校驗輔助觸發器變量。這更糟糕,因爲它使得循環的邏輯更加複雜以簡化迭代:而不是每次通過循環執行一次操作,而是按順序進行並且不需要分支,而是必須經過兩次並在心理上分支。請注意,如果它的長度爲奇數,則會跳過最後一個元素;如果想要處理這些情況,可以在之後添加isFirst
的支票。
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 + "]");
}
}
最後,注意,所有這些迭代器和輔助變量有多餘範圍(他們只使用了循環本身的,所以他們污染了當地的環境):可以把它們包裹在塊限制範圍,雖然平時所產生的嵌套被認爲比超出範圍更糟:
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 + "]");
}
}
不能這樣出界嗎? – CQM
@CQM如果元素數量不均勻,那麼是的。爲了避免這種情況,'int validSize = string.size()& ~1;'並在循環條件中使用它。 – hyde