Интерфейс Listlterator
Интерфейс
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.