2015-10-07 4 views
1

Документация говорит:ListIterator в предыдущей() метод

предыдущий()

Возвращает предыдущий элемент в списке и перемещает позицию курсора в обратном направлении.

Скажем, у меня есть ArrayList: [1,2,3,4,5]

Изначально курсор указывает здесь: [1, 2, 3, 4, 5]

    ^
         | 

И после этого куска кода

ListIterator li = al.listIterator(); 
    while(li.hasNext()){ 
     int ab = (int) li.next(); 
     if(ab > 4) 
      break; 
    } 

[1 2 3 4 5]

 ^
     | 

Но когда я

System.out.println(li.previous()); 

Он выводит 5 вместо этого он должен выводить 4, поскольку он возвращает предыдущий элемент. Почему это происходит? Как это исправить?.

+1

Я думаю, что ваш вопрос имеет некоторые важные проблемы форматирования, которые делают невозможным понимание вашей проблемы. Исправьте указатель курсора, который у вас есть в вопросе. –

+1

javadoc также указывает на состояние 'Обратите внимание, что чередующиеся вызовы следующего и предыдущего будут возвращать один и тот же элемент повторно'. Поскольку вы назовете 'next' заранее, он снова напечатает тот же элемент. – SomeJavaGuy

ответ

1

Причина:

Форма docs из next() метод

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

Это рассказывает, почему вы получаете 5, а не 4.

Fix:

Как снова сказал docs, чтобы получить желаемый результат, то, что вы можете сделать, - когда условие выполнено, переместитесь на один шаг назад.

ListIterator li = al.listIterator(); 
    while(li.hasNext()){ 
     int ab = (int) li.next(); 
     if (ab > 4){ 
      li.previous(); 
      break; 
     } 
    } 
1

li.next() только что вернулся 5 (потому 5 > 4)

Таким образом, li.previous() возвращается 5 снова.

(А Иным вызов li.next() бы бросили NoSuchElementException)

0

В конце своего цикла, li.next() возвращает 5и движется мимо него вперед. Итак, previous() возвращает 5. На данный момент hasNext() равно false, так что break в пределах if не требуется, так как условие цикла автоматически вычисляется до false.

1

Вы не в курсе, где расположен указатель.

При первом инициализируется, указатель будет здесь:

[1] [2] [3] [4] [5] 
^ 

После кода, он будет указывать здесь:

[1] [2] [3] [4] [5] 
        ^

Таким образом, предыдущее значение после того, как ваш код на самом деле 5, а вы видели, когда вы тестировали.

Смежные вопросы