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