您可以避免使用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 + "]");
}
}