Интерфейс Listiterator расширяет интерфейс iterator , обеспечивая перемещение по коллекции как в прямом, так и в обратном направлении. Он может быть реализован только в тех коллекциях, в которых есть понятия следующего и предыдущего элемента и где элементы пронумерованы.
В интерфейс Listiterator добавлены следующие методы:
void add (Object element) — добавляет элемент element перед текущим элементом;
boolean hasPrevious () — возвращает true , если в коллекции есть элементы, стоящие перед текущим элементом;
int nextindex() — возвращает индекс текущего элемента; если текущим является последний элемент коллекции, возвращает размер коллекции;
Object previous () — возвращает предыдущий элемент и делает его текущим;
int previous index () — возвращает индекс предыдущего элемента;
void set (Object element) — заменяет текущий элемент элементом element;
выполняется сразу после next () или previous ().
Как видите, итераторы могут изменять коллекцию, в которой они работают, добавляя, удаляя и заменяя элементы. Чтобы это не приводило к конфликтам, предусмотрена исключительная ситуация, возникающая при попытке использования итераторов параллельно "родным" методам коллекции. Именно поэтому в листинге 6.5 действия с итератором заключены в блок tryUcatch(){} .
Изменим окончание листинга 6.5 с использованием итератора Listiterator .
// Текст листинга 6.1...
// ...
Listiterator lit = v.listlterator(); // Получаем итератор вектора
// Указатель сейчас находится перед началом вектора
try{
while(lit.hasNext()) // Пока в векторе есть элементы
System.out.println(lit.next()); // Переходим к следующему
// элементу и выводим его
// Теперь указатель за концом вектора. Пройдем к началу
while (lit. hasPrevious ())
System, out. printlnf lit. previblis ()); :
}catch (Exception e) ()
Интересно, что повторное применение методов next () и previous () друг за другом будет выдавать один и тот же текущий элемент. : Посмотрим теперь, какие возможности предоставляют классы-коллекции Java 2.