2015-02-03 5 views
2

У меня есть следующий фрагмент кода:Почему список итератора в Java не возвращает правильный элемент при изменении направления

LinkedList<String> list = new LinkedList<String>(); 
list.add("1"); 
list.add("2"); 
list.add("3"); 
list.add("4"); 
list.add("5"); 
list.add("6"); 
ListIterator<String> iterator = list.listIterator(); 
String str = iterator.next(); 
System.out.println(str); 
str = iterator.next(); 
System.out.println(str); 
str = iterator.next(); 
System.out.println(str); 
System.out.println("switch direction"); 
str = iterator.previous(); 
System.out.println(str); 
str = iterator.previous(); 
System.out.println(str); 

выход заключается в следующем:

1 
2 
3 
switch direction 
3 
2 

Я должен был бы напечатать сверху итератор.previous() call, но нет. Это дает мне один и тот же элемент, так как эта функция ничего не делает при первом вызове.

То же самое происходит, если я начинаю итерацию от последней до первой и меняю направление в середине назад до последнего.

Есть ли причина дизайна для этого или это может быть просто ошибка в итераторе списка Java?

Я использую:

java version "1.6.0_45" 
Java(TM) SE Runtime Environment (build 1.6.0_45-b06) 
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode) 

ответ

7

Из Javadoc

(Обратите внимание, что чередующиеся вызовы next и previous будет возвращать тот же самый элемент несколько раз.)

JavaDoc также описывает

Итератор для списка длины п имеет п + 1 возможные позиции курсора, как показано на CARETS (^) ниже:

     Element(0) Element(1) Element(2) ... Element(n-1) 
cursor positions:^  ^  ^  ^    ^

Если курсор находится перед Element(0), и вы a next(), он будет потреблять Element(0) и двигаться вперед. Когда вы сделаете previous, он снова будет потреблять Element(0) и двигаться позади.

+2

Также из Javadoc: ListIterator не имеет текущего элемента; его позиция курсора всегда находится между элементом, который будет возвращен вызовом previous() и элементом, который будет возвращен вызовом next() –

2

Это по дизайну, согласно Javadocs for ListIteator's previous method.

Возвращает предыдущий элемент в списке и перемещает позицию курсора назад. Этот метод можно вызывать повторно, чтобы перебирать список в обратном порядке или смешивать с вызовами next() для перехода назад и вперед. (Обратите внимание, что чередующиеся звонки на следующий и предыдущий будет возвращать один и тот же элемент несколько раз.)

Вы можете думать о текущей позиции итератора, как непосредственно перед следующим пункт должны быть возвращены, и сразу же после того, как предыдущий пункт, который будет возвращен ,

Визуализация после последнего next, но перед первым previous, после 3 печатается впервые:

[ "1" ] [ "2" ] [ "3" ] [ "4 "] 
         ^

Визуализация после первого previous, когда 3 печатается во второй раз:

[ "1" ] [ "2" ] [ "3" ] [ "4 "] 
       ^

(Это как ListIterator Javadocs изображает текущее положение.)