Использование гуавы Итераторы
В Гуаве есть общие служебные классы для этой цели.Точный ответ в этих терминах будет следующим:
В этом примере есть некоторый риск встретить IndexOutOfBoundsException , если предоставлено position
, это предварительный итератор за пределами границ .
@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);
}
Итераторы имеют удобную перегрузку для метода 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();
}
Если вы не можете или не хотите зависеть от гуавы
Вот очень просто (образовательная) реализация для достижения позиции итератора.
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();
}