У меня есть LinkedList, над которым мне нужно многократно повторять и повторять. Я использую его для отслеживания серии страниц в рабочем процессе, который будет создан динамически. Это не ведет себя так, как я ожидал. В этом примере:
LinkedList<String> navigationCases;
navigationCases.add("page1");
navigationCases.add("page2");
navigationCases.add("page3");
navigationCases.add("page4");
ListIterator navigationItr = navigationCases.listIterator();
navigationItr.next(); // Returns page1
navigationItr.next(); // Returns page2
navigationItr.previous(); //Returns page2 again
navigationItr.next(); //Returns page2 again
Я подумал, что, возможно, я неправильно создавал свой список или неправильно использовал Iterator, но после прочтения документации это выглядит по дизайну:
У ListIterator нет текущего элемента; его позиция курсора всегда лежит между элементом, который будет возвращен вызовом previous() и элементом, который будет возвращен вызовом next().
и
(Далее) Возвращает следующий элемент в списке. Этот метод можно многократно вызывать, чтобы перебирать список или смешивать с вызовами предыдущего, чтобы идти туда и обратно. (Обратите внимание, что чередующиеся вызовы следующего и предыдущего будут возвращать один и тот же элемент повторно.)
Итак, после прочтения этого, понятно, почему мой код ведет себя так, как он делает. Я просто не понимаю, почему так должно работать. Даже удаление, похоже, сгибается назад, чтобы выполнить эту реализацию:
Обратите внимание, что методы remove() и set (Object) не определены в терминах позиции курсора; они определены для работы с последним элементом, возвращаемым вызовом next() или previous().
Концептуально, LinkedList, похоже, очень хорошо моделировал мои рабочие процессы, но я не могу использовать Iterator, который ведет себя таким образом. Я что-то пропустил здесь или должен просто написать свой собственный класс, поддерживающий список дел и перемещающийся через них?