ListIterator является частью фреймворка Java Collections и используется для обхода и манипулирования элементами в списке как в прямом, так и в обратном направлении. Его можно использовать с реализациями интерфейса List, такими как ArrayList, LinkedList и т. д.
Интерфейс ListIterator предоставляет методы для:
- Перемещение вперед и назад по списку.
- Безопасное добавление, удаление и изменение элементов в списке во время итерации.
- Манипулирование на основе индекса при итерации по списку.
1. Пример ListIterator в Java
Чтобы получить ссылку на ListIterator, мы используем метод listIterator() для объекта List.
ListIterator iterator = list.listIterator();
В следующем примере у нас есть список, содержащий четыре строки. Сначала мы итерируем в прямом направлении, а затем в обратном направлении.
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));ListIterator<String> iterator = list.listIterator();System.out.println("Forward Traversal:");while(iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.println("\n\nBackward Traversal:");while(iterator.hasPrevious()) {System.out.print(iterator.previous() + " ");}
Вывод программы.
Forward Traversal:A B C DBackward Traversal:D C B A
2. Методы ListIterator
Интерфейс ListIterator определяет несколько методов для общих случаев использования:
Название метода | Описание |
---|---|
hasNext() | Возвращает true, если в списке есть другой элемент. |
следующий() | Возвращает следующий элемент в списке и перемещает курсор на один элемент вперед. |
имеетПредыдущий() | Возвращает true, если в списке есть предыдущий элемент. |
предыдущий() | Возвращает предыдущий элемент в списке и перемещает курсор на один элемент назад. |
следующийИндекс() | Возвращает индекс элемента, который будет возвращен next(). |
предыдущийИндекс() | Возвращает индекс элемента, который будет возвращен функцией previous(). |
добавить(Е е) | Добавляет элемент в список в текущей позиции курсора. |
удалять() | Удаляет последний элемент, возвращенный next() или previous() из списка. |
набор(Е е) | Заменяет последний элемент, возвращенный next() или previous(), указанным элементом. |
Вот программа на Java, демонстрирующая все вышеперечисленные методы ListIterator в действии:
import java.util.*;public class ListIteratorMethodsExample {public static void main(String[] args) {// Initialize a list with some elementsList<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));System.out.println("Initial List: " + list);// Create a ListIterator for the listListIterator<String> iterator = list.listIterator();// Demonstrate hasNext() and next()System.out.println("\nUsing hasNext() and next():");while(iterator.hasNext()) {System.out.println("Next element: " + iterator.next());}// Move the cursor back to the beginning for the next testiterator = list.listIterator();// Demonstrate hasPrevious() and previous()System.out.println("\nUsing hasPrevious() and previous():");while(iterator.hasPrevious()) {System.out.println("Previous element: " + iterator.previous());}// Move forward again for add and set demonstrationiterator = list.listIterator();// Demonstrate add()System.out.println("\nUsing add():");while(iterator.hasNext()) {String element = iterator.next();if(element.equals("B")) {iterator.add("X");System.out.println("Added 'X' after B.");}}System.out.println("List after add operation: " + list);// Demonstrate remove()iterator = list.listIterator();System.out.println("\nUsing remove():");while(iterator.hasNext()) {String element = iterator.next();if(element.equals("C")) {iterator.remove();System.out.println("Removed 'C'.");}}System.out.println("List after remove operation: " + list);// Demonstrate set()iterator = list.listIterator();System.out.println("\nUsing set():");while(iterator.hasNext()) {String element = iterator.next();if(element.equals("D")) {iterator.set("Y");System.out.println("Replaced 'D' with 'Y'.");}}System.out.println("List after set operation: " + list);}}
Вывод программы:
Initial List: [A, B, C, D]Using hasNext() and next():Next element: ANext element: BNext element: CNext element: DUsing hasPrevious() and previous():Previous element: DPrevious element: CPrevious element: BPrevious element: AUsing add():Added 'X' after B.List after add operation: [A, B, X, C, D]Using remove():Removed 'C'.List after remove operation: [A, B, X, D]Using set():Replaced 'D' with 'Y'.List after set operation: [A, B, X, Y]
3. Итератор против ListIterator
В следующей таблице сравниваются интерфейсы Iterator и ListIterator:
Особенность | Итератор | ListIterator |
---|---|---|
Направление движения | Только вперед. | Вперед и назад. |
Операции, специфичные для списков | Только итерация по элементам. | Можно безопасно добавлять, удалять и изменять элементы во время обхода. |
Индекс Доступа | Не поддерживается. | Методы nextIndex() и previousIndex() предоставляют информацию об индексе. |
Обработка параллелизма | При неправильном использовании может выдать исключение ConcurrentModificationException. | Обеспечивает безопасное удаление/изменение при перемещении по списку. |
Поддерживаемые коллекции | Работает со всеми коллекциями(не ограничиваясь списками). | Работает только с коллекциями на основе списков, такими как ArrayList, LinkedList. |
Откат назад | Не поддерживается. | Возврат поддерживается с помощью previous() и hasPrevious(). |
Основной вариант использования | Универсальная итерация по коллекциям. | Итерация с двунаправленной навигацией и манипулированием списками. |
4. Заключение
В этом уроке мы изучили интерфейс Java ListIterator, методы ListIterator и простые примеры итерации по элементам списка в прямом и обратном направлениях.
Пишите мне свои вопросы в комментариях.