Поиск по сайту:

Java ListIterator — ListIterator в Java


Как мы знаем, в Java есть четыре курсора: Enumeration, Iterator, ListIterator и Spliterator. Мы уже обсуждали курсоры Enumeration и Iterator в моем предыдущем посте. Прежде чем читать этот пост, просмотрите мой предыдущий пост по адресу: Java Iterator. В этом посте мы обсудим третий курсор Java: ListIterator.

Итератор списка Java

Как и итератор, ListIterator — это итератор Java, который используется для последовательного перебора элементов из реализованного объекта List.

  • Он доступен, начиная с Java 1.2.
  • Расширяет интерфейс Iterator.
  • Это полезно только для классов, реализованных в List.
  • В отличие от Iterator, он поддерживает все четыре операции: CRUD (CREATE, READ, UPDATE и DELETE).
  • В отличие от Iterator, он поддерживает итерации как в прямом, так и в обратном направлении.
  • Это двунаправленный итератор.
  • У него нет текущего элемента; его позиция курсора всегда находится между элементом, который будет возвращен вызовом предыдущей(), и элементом, который будет возвращен вызовом следующей().

ПРИМЕЧАНИЕ. Что такое операции CRUD в Collection API?

  • CREATE: добавление новых элементов в объект Collection.
  • ПРОЧИТАЙТЕ: извлечение элементов из объекта Collection.
  • ОБНОВЛЕНИЕ: обновление или установка существующих элементов в объекте Коллекция.
  • УДАЛИТЬ: удаление элементов из объекта Коллекция.

Диаграмма класса Java ListIterator

Методы ListIterator в Java

Интерфейс Java ListIterator имеет следующие методы.

  • void add(E e): вставляет указанный элемент в список.
  • boolean hasNext(): возвращает значение true, если этот итератор списка имеет больше элементов при обходе списка в прямом направлении.
  • boolean hasPrevious(): возвращает значение true, если этот итератор списка имеет больше элементов при обходе списка в обратном направлении.
  • E next(): возвращает следующий элемент в списке и перемещает курсор вперед.
  • int nextIndex(): возвращает индекс элемента, который будет возвращен последующим вызовом next().
  • E, предыдущая(): возвращает предыдущий элемент в списке и перемещает позицию курсора назад.
  • int previousIndex(): возвращает индекс элемента, который будет возвращен последующим вызовом предыдущей().
  • 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<String&gt names = new LinkedList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
		
	// Getting ListIterator
	ListIterator<String&gt namesIterator = names.listIterator();
	
	// Traversing elements
	while(namesIterator.hasNext()){
	   System.out.println(namesIterator.next());			
	}	

	// Enhanced for loop creates Internal Iterator here.
	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<String&gt names = new LinkedListt<>();
		names.add("Rams");
		names.add("Posa");
		names.add("Chinni");
		
		// Getting ListIterator
		ListIterator<String&gt listIterator = names.listIterator();
		
		// Traversing elements
		System.out.println("Forward Direction Iteration:");
		while(listIterator.hasNext()){
			System.out.println(listIterator.next());			
		}	
		
		// Traversing elements, 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. Мы можем разделить их на два основных типа, как показано ниже:

  • Однонаправленные итераторы Это курсоры, которые поддерживают только итерации прямого направления. Например, перечисление, итератор и т. д. являются однонаправленными итераторами. Двунаправленные итераторы Это курсоры, которые поддерживают итерации как прямого, так и обратного направления. Например, ListIterator — это двунаправленный итератор.

Как Java ListIterator работает внутри?

Как мы знаем, Java ListIterator работает в обоих направлениях, что означает, что он работает как в прямом, так и в обратном направлении. Это двунаправленный итератор. Для поддержки этой функциональности он имеет два набора методов.

  • Методы итерации в прямом направлении Нам нужно использовать следующие методы для поддержки итерации в прямом направлении:

  1. hasNext())
  2. следующий()
  3. следующийИндекс()

  • Методы итерации в обратном направлении Нам нужно использовать следующие методы для поддержки итерации в обратном направлении:

  1. hasPrevious()
  2. предыдущий()
  3. предыдущийИндекс()

В моем предыдущем посте мы уже обсуждали, как итератор работает внутри при переадресации направления в разделе «Как итератор Java работает внутри?» раздел. Даже ListIterator также работает таким же образом. Если вы хотите просмотреть мой предыдущий пост, нажмите здесь: Java Iterator. В этом разделе мы обсудим, как 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.hasNext();
namesIterator.next();
namesIterator.hasPrevious();
namesIterator.previous();
namesIterator.hasPrevious();

Преимущества ListIterator

В отличие от Iterator, ListIterator имеет следующие преимущества:

  • Как и Iterator, он поддерживает операции READ и DELETE.
  • Он также поддерживает операции CREATE и UPDATE.
  • Это означает, что он поддерживает операции CRUD: CREATE, READ, UPDATE и DELETE.
  • Он поддерживает итерацию как в прямом, так и в обратном направлении. Это означает, что это двунаправленный курсор Java.
  • Имена методов просты, и их легко использовать.

Ограничения ListIterator

По сравнению с Iterator, Java ListIterator имеет много преимуществ. Тем не менее, он по-прежнему имеет следующие некоторые ограничения.

  • Это классы реализации списка только для итераторов.
  • В отличие от Iterator, он не применим ко всему API коллекции.
  • Это не универсальный курсор Java.
  • По сравнению с Spliterator, он НЕ поддерживает параллельную итерацию элементов.
  • По сравнению с Spliterator, он НЕ поддерживает более высокую производительность при повторении больших объемов данных.

Сходства между Iterator и ListIterator

В этом разделе мы обсудим сходство между двумя курсорами Java: Iterator и ListIterator.

  • Беспокойство появилось в Java 1.2.
  • Оба являются итераторами, используемыми для итерации элементов коллекции или списка.
  • Оба поддерживают операции READ и DELETE.
  • Оба поддерживают итерацию прямого направления.
  • Оба не являются устаревшими интерфейсами.

Различия между Iterator и ListIterator

В этом разделе мы еще обсудим различия между Java Two Iterators: 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. Я надеюсь, что эти теории и примеры Java ListIterator помогут вам приступить к программированию ListIterator. Ссылка: документ API ListIterator