Java, какой элемент в ListIterator считается предыдущим?

В настоящее время я пытаюсь узнать, как реализовать свои собственные ListIterators. У меня большая часть реализована и готова к работе, за исключением того, что меня смущает метод previous(). По стандартному соглашению, могу ли я получить объяснение того, как обычно интерпретируется предыдущая().

i.e.:

             >cursor<
dog     cat    fish     bird     frog    snake

Согласно Oracle Java Platform 7 API:

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

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

Чего я не совсем понимаю, так это того, что если вызывается предыдущая (), возвращает ли она «рыбу» или «кошку».

Я понимаю это 2 способами:

1) «рыба» была объектом, на котором вы были ранее

2) «кошка» — это объект с индексом, численно предшествующим индексу «рыба».

Если предыдущий возвращает «рыбу», то действительно ли remove() удаляет один и тот же элемент независимо от направления обхода?


person Community    schedule 02.07.2014    source источник


Ответы (2)


Проще всего представить курсор как между двумя элементами. Итак, в начале это до dog. Вызов next() возвращает dog и перемещает его между dog и cat и т. д. Вы закончили итерацию, когда курсор находится после snake.

Таким образом, next() всегда возвращает значение после курсора и перемещает курсор в позицию после этого. previous() всегда возвращает значение перед курсором и перемещает курсор в положение перед ним.

РЕДАКТИРОВАТЬ: Как отметил Дэвид Конрад в комментариях: remove() всегда удаляет последнее значение, которое было возвращено либо next(), либо previous(). Это, вероятно, наименее очевидная часть, когда дело доходит до того, как я объяснил это выше... гораздо проще смоделировать такое поведение, используя описанный вами вид курсора «на элементе».

person Jon Skeet    schedule 02.07.2014
comment
И remove() всегда удаляет последнее значение, которое было возвращено либо next(), либо previous(), чтобы ответить на вопрос, поднятый в последнем предложении вопроса. - person David Conrad; 03.07.2014
comment
Вот это да. Это был очень простой и понятный ответ. Большое спасибо. - person ; 03.07.2014
comment
@DavidConrad: Спасибо, я пропустил этот момент. Добавлю его. - person Jon Skeet; 03.07.2014

ListIterator сложно, потому что определение указателя немного отличается.

В документации по Java 7 говорится:

ListIterator не имеет текущего элемента; его позиция курсора всегда находится между элементом, который будет возвращен вызовом предыдущей(), и элементом, который будет возвращен вызовом следующей().

Возможные позиции курсора (обозначены звездочками):

*     *     *     *     *     *     *
  dog   cat  fish  bird  frog  snake

Функция next перемещает курсор на одну позицию и возвращает элемент между:

BEFORE:
*     *     v     *     *     *     *
  dog   cat  fish  bird  frog  snake
AFTER:
*     *     *     v     *     *     *
  dog   cat  FISH  bird  frog  snake
RETURNED: fish

Функция previous переместит курсор назад и вернет элемент между:

BEFORE:
*     *     *     *     *     v     *
  dog   cat  fish  bird  frog  snake
AFTER:
*     *     *     *     v     *     *
  dog   cat  fish  bird  FROG  snake
RETURNED: frog
person Community    schedule 02.07.2014