你可以使用
迭代器来避免索引,这适用于任何
可迭代对象,而不仅仅是列表。只需获取一个迭代器,并在每个循环迭代中将其增加两次即可。
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 + "]");
}
}