使用番石榴Iterators
Guava 对此提议有一个通用的实用程序类。这个术语的确切答案是:
在此示例中,如果提供的position 是超出其边界 的高级迭代器,则可能会遇到IndexOutOfBoundsException。
@Test
public void getNthElement() {
List<String> alphabet = Arrays.asList("a", "b", "c", "d");
Iterator<String> iterator = alphabet.iterator();
int position = 3;
String forthElement = Iterators.get(iterator, 3);
assertEquals("d", forthElement);
}
Iterators 为get(Iterator<T>, int) 方法提供了方便的重载,因此您永远不会得到IndexOutOfBoundsException。
@Test
public void getNthElementWithDefaultValue() {
List<String> alphabet = Arrays.asList("a", "b", "c", "d");
Iterator<String> iterator = alphabet.iterator();
int position = 10;
final String actual = Iterators.get(iterator, position, "default");
assertEquals("default", actual);
}
如果有必要跳过或到达特定位置,但这里是@Nikolas 提到的案例。在这里您可以轻松获取NoSuchElementException
@Test
public void advance() {
List<String> alphabet = Arrays.asList("a", "b", "c", "d", "e", "f");
Iterator<String> iterator = alphabet.iterator();
// will return the number of skipped elements
int advance = Iterators.advance(iterator, 3);
assertEquals(3, advance);
assertEquals("d", iterator.next());
}
@Test(expected = NoSuchElementException.class)
public void advanceBeyond() {
List<String> alphabet = Arrays.asList("a", "b", "c");
Iterator<String> iterator = alphabet.iterator();
int advance = Iterators.advance(iterator, 3);
// throws the exception because we advanced iterator to end
iterator.next();
}
如果你不能或不想依赖 Guava
这是到达迭代器位置的非常简单(教育)的实现。
public static <T> T get(Iterator<T> iterator, int pos) {
if (pos < 0) {
throw new IllegalArgumentException("Position is negative!");
}
int i = 0;
while (i++ < pos) {
iterator.next();
}
return iterator.next();
}