Как мы знаем, в Java есть четыре курсора: Enumeration, Iterator, ListIterator и Spliterator. Мы уже обсудили курсоры Enumeration и Iterator в моем предыдущем сообщении. Прежде чем переходить к этому сообщению, пожалуйста, ознакомьтесь с моим предыдущим сообщением по ссылке: Java Iterator. В этом сообщении мы обсудим третий курсор Java: ListIterator.
Java ListIterator
Как и Iterator, ListIterator является итератором Java, который используется для итерации элементов один за другим из объекта списка.
- Он доступен с версии Java 1.2.
- Он расширяет интерфейс Iterator.
- Он полезен только для классов, реализующих List.
- В отличие от Iterator, он поддерживает все четыре операции: CRUD (CREATE, READ, UPDATE и DELETE).
- В отличие от Iterator, он поддерживает как прямое, так и обратное перемещение.
- Это двунаправленный итератор.
- У него нет текущего элемента; его позиция курсора всегда находится между элементом, который будет возвращен при вызове previous(), и элементом, который будет возвращен при вызове next().
ПРИМЕЧАНИЕ:- Что такое операции CRUD в API коллекций?
- CREATE: Добавление новых элементов в объект коллекции.
- READ: Получение элементов из объекта коллекции.
- ОБНОВЛЕНИЕ: Обновление или установка существующих элементов в объекте Collection.
- УДАЛЕНИЕ: Удаление элементов из объекта Collection.
Диаграмма классов Java ListIterator
В Java ListIterator – это интерфейс в API Collection. Он расширяет интерфейс Iterator. Для поддержки итерации вперед и назад и операций CRUD у него есть следующие методы. Мы можем использовать этот итератор для всех классов, реализующих List, таких как ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector и т.д. Мы рассмотрим эти методы подробно в следующих разделах с некоторыми полезными методами.
Методы Java ListIterator
У интерфейса Java ListIterator есть следующие методы.
- void add(E e): Вставляет указанный элемент в список.
- boolean hasNext(): Возвращает true, если у этого итератора списка есть еще элементы при обходе списка в прямом направлении.
- boolean hasPrevious(): Возвращает true, если у этого итератора списка есть еще элементы при обходе списка в обратном направлении.
- E next(): Returns the next element in the list and advances the cursor position.
- int nextIndex(): Возвращает индекс элемента, который будет возвращен при последующем вызове next().
- E previous(): Returns the previous element in the list and moves the cursor position backwards.
- int previousIndex(): Возвращает индекс элемента, который будет возвращен при последующем вызове previous().
- void remove(): Удаляет из списка последний элемент, который был возвращен next() или previous().
- void set(E e): Заменяет последний элемент, возвращенный next() или previous(), указанным элементом.
Мы будем рассматривать эти методы по очереди с полезными примерами в следующих разделах.
Пример базового использования Java ListIterator
В этом разделе мы обсудим некоторые методы ListIterator с примерами. Сначала мы должны понять, как получить этот объект итератора. Как получить ListIterator?
ListIterator<E> listIterator()
Этот метод возвращает итератор списка по элементам в этом списке. Пример:-
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// Получение ListIterator
ListIterator<String> namesIterator = names.listIterator();
// Обход элементов
while(namesIterator.hasNext()){
System.out.println(namesIterator.next());
}
// Усовершенствованный цикл for создает здесь внутренний итератор.
for(String name: names){
System.out.println(name);
}
}
}
Результат:-
Rams
Posa
Chinni
Пример двунаправленного итерирования с использованием ListIterator
В данном разделе мы рассмотрим, как работают методы ListIterator для выполнения итераций в прямом и обратном направлении.
import java.util.*;
public class BiDirectinalListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// Получение ListIterator
ListIterator<String> listIterator = names.listIterator();
// Обход элементов
System.out.println("Forward Direction Iteration:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// Обход элементов, the iterator is at the end at this point
System.out.println("Backward Direction Iteration:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
Вывод:-
Forward Direction Iteration:
Rams
Posa
Chinni
Backward Direction Iteration:
Chinni
Posa
Rams
Типы итераторов в Java
Как мы знаем, в Java есть четыре курсора: Enumeration, Iterator, ListIterator и Spliterator. Мы можем классифицировать их на два основных типа, как показано ниже:
- Уни-дирекциональные итераторы
Это курсоры, которые поддерживают только итерации в прямом направлении. Например, Enumeration, Iterator и т. д. являются уни-дирекциональными итераторами.- Би-дирекциональные итераторы
Это курсоры, которые поддерживают как итерации в прямом направлении, так и итерации в обратном направлении. Например, ListIterator – это би-дирекциональный итератор.
Как работает ListIterator в Java внутренне?
Как мы знаем, ListIterator в Java работает в обоих направлениях, что означает, что он работает и в прямом, и в обратном направлении. Это би-дирекциональный итератор. Для поддержки этой функциональности у него есть два набора методов.
- Методы итерации в прямом направлении
Мы должны использовать следующие методы для поддержки итерации в прямом направлении:
- hasNext())
- next()
- nextIndex()
- Методы итерации в обратном направлении
Мы должны использовать следующие методы для поддержки итерации в обратном направлении:
- hasPrevious()
- previous()
- previousIndex()
В моем предыдущем посте мы уже обсудили, как работает итератор внутренне в прямом направлении в разделе “Как работает итератор Java внутренне?” Даже ListIterator также работает таким же образом. Если вы хотите ознакомиться с моим предыдущим постом, пожалуйста, нажмите здесь: Итератор Java. В этом разделе мы обсудим, как ListIterator работает в обратном направлении. Давайте возьмем следующий объект LinkedList, чтобы понять эту функциональность.
List<String> names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");
Теперь создадим объект ListIterator на LinkedList, как показано ниже:
ListIterator<String> namesIterator = names.listLterator();
Давайте предположим, что “namesIterator” ListIterator выглядит следующим образом: Здесь курсор ListIterator указывает на элемент перед первым элементом списка. Теперь мы запускаем следующий фрагмент кода в цикле while.
namesIterator.hasNext();
namesIterator.next();
Когда мы запускаем вышеуказанный фрагмент кода в цикле while, курсор ListIterator указывает на последний элемент в LinkedList. Затем мы можем запустить следующий фрагмент кода для начала обхода с конца к началу.
namesIterator.hasPrevious();
namesIterator.previous();
Когда мы запускаем фрагмент кода выше, указатель курсора ListIterator указывает на “Предпоследний” элемент в списке, как показано на диаграмме выше. Выполните этот процесс, чтобы довести указатель курсора ListIterator до первого элемента связанного списка.
После чтения первого элемента, если мы выполним фрагмент кода ниже, он вернет значение “false”.
namesIterator.hasPrevious();
Поскольку указатель курсора ListIterator указывает перед первым элементом связанного списка, метод hasPrevious() возвращает значение false. Изучив все эти диаграммы, мы можем сказать, что Java ListIterator поддерживает итерации как в прямом, так и в обратном направлении, как показано на диаграммах ниже. Поэтому он также известен как двунаправленный указатель. Итератор в прямом направлении
Итератор в обратном направлении
Преимущества ListIterator
В отличие от Iterator, ListIterator обладает следующими преимуществами:
- Как и Iterator, он поддерживает операции ЧТЕНИЯ и УДАЛЕНИЯ.
- Также поддерживает операции СОЗДАНИЯ и ОБНОВЛЕНИЯ.
- Это означает, что он поддерживает операции CRUD: операции CREATE, READ, UPDATE и DELETE.
- Он поддерживает как прямое, так и обратное направление итерации. Это означает, что это двунаправленный курсор Java.
- Названия методов просты и легки в использовании.
Ограничения ListIterator
По сравнению с итератором, у Java ListIterator есть множество преимуществ. Однако у него все еще есть следующие некоторые ограничения.
- Это только реализации списков с итератором.
- В отличие от итератора, он не применим для всего API коллекций.
- Это не универсальный курсор Java.
- По сравнению со Spliterator, он НЕ поддерживает параллельную итерацию элементов.
- По сравнению со Spliterator, он НЕ обеспечивает лучшую производительность при итерации большого объема данных.
Похожие моменты между Iterator и ListIterator
В этом разделе мы обсудим сходства между двумя курсорами Java: Iterator и ListIterator.
- Оба были представлены в Java 1.2.
- Оба являются итераторами, используемыми для итерации элементов коллекции или списка.
- Оба поддерживают операции ЧТЕНИЕ и УДАЛЕНИЕ.
- Оба поддерживают итерацию вперёд.
- Оба не являются устаревшими интерфейсами.
Различия между Iterator и ListIterator
В этом разделе мы обсудим различия между двумя итераторами в Java: Iterator и ListIterator.
Iterator | ListIterator |
---|---|
Introduced in Java 1.2. | Introduced in Java 1.2. |
It is an Iterator for whole Collection API. | It is an Iterator for only List implemented classes. |
It is an Universal Iterator. | It is NOT an Universal Iterator. |
It supports only Forward Direction Iteration. | It supports both Forward and Backward Direction iterations. |
It’s a Uni-Directional Iterator. | It’s a Bi-Directional Iterator. |
It supports only READ and DELETE operations. | It supports all CRUD operations. |
We can get Iterator by using iterator() method. | We can ListIterator object using listIterator() method. |
Это все, что касается ListIterator в Java. Надеюсь, эти теории и примеры ListIterator в Java помогут вам начать программирование с ListIterator. Ссылка: Документация API ListIterator
Source:
https://www.digitalocean.com/community/tutorials/java-listiterator