Como sabemos, Java possui quatro cursores: Enumeração, Iterador, ListIterator e Spliterator. Já discutimos os cursores de Enumeração e Iterador em minha postagem anterior. Antes de prosseguir com esta postagem, por favor, dê uma olhada na minha postagem anterior em: Java Iterator. Nesta postagem, discutiremos sobre o terceiro cursor do Java: ListIterator.
Java ListIterator
Assim como o Iterador, o ListIterator é um Iterator do Java, que é usado para iterar elementos um por um de um objeto implementado List.
- Ele está disponível desde o Java 1.2.
- Ele estende a interface Iterator.
- É útil apenas para classes implementadas de List.
- Ao contrário do Iterador, ele suporta todas as quatro operações: CRUD (CREATE, READ, UPDATE e DELETE).
- Ao contrário do Iterador, ele suporta iterações tanto na Direção Avançada quanto na Direção Reversa.
- É um Iterator Bidirecional.
- Não possui um elemento atual; sua posição do cursor sempre está entre o elemento que seria retornado por uma chamada para previous() e o elemento que seria retornado por uma chamada para next().
NOTA:- O que são operações CRUD na API de Coleções?
- CRIAR: Adicionar novos elementos ao objeto de Coleção.
- Ler: Recuperar elementos do objeto de Coleção.
- ATUALIZAÇÃO: Atualizando ou configurando elementos existentes no objeto de Coleção.
- EXCLUSÃO: Removendo elementos do objeto de Coleção.
Diagrama de Classe da Classe Java ListIterator
No Java, ListIterator é uma interface na API de Coleção. Ela estende a interface Iterator. Para oferecer suporte à iteração nas direções Forward (para frente) e Backward (para trás) e operações CRUD, ela possui os seguintes métodos. Podemos usar esse Iterador para todas as classes List implementadas, como ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector, etc. Vamos explorar esses métodos em profundidade com alguns métodos úteis nas próximas seções.
Métodos do Java ListIterator
A interface Java ListIterator possui os seguintes Métodos.
- void add(E e): Insere o elemento especificado na lista.
- boolean hasNext(): Retorna true se este iterador de lista tiver mais elementos ao percorrer a lista na direção para frente.
- boolean hasPrevious(): Retorna true se este iterador de lista tiver mais elementos ao percorrer a lista na direção reversa.
- E next(): Returns the next element in the list and advances the cursor position.
- int nextIndex(): Retorna o índice do elemento que seria retornado por uma chamada subsequente a next().
- E previous(): Returns the previous element in the list and moves the cursor position backwards.
- int previousIndex(): Retorna o índice do elemento que seria retornado por uma chamada subsequente a previous().
- void remove(): Remove da lista o último elemento que foi retornado por next() ou previous().
- void set(E e): Substitui o último elemento retornado por next() ou previous() pelo elemento especificado.
Vamos explorar esses métodos um por um com exemplos úteis nas seções seguintes.
Exemplo Básico de Java ListIterator
Nesta seção, discutiremos alguns métodos do ListIterator com exemplos. Primeiro, precisamos entender como obter esse objeto iterador. Como obter o ListIterator?
ListIterator<E> listIterator()
Ele retorna um iterador de lista sobre os elementos nesta lista. Exemplo:-
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// Obtendo o ListIterator
ListIterator<String> namesIterator = names.listIterator();
// Percorrendo elementos
while(namesIterator.hasNext()){
System.out.println(namesIterator.next());
}
// O loop aprimorado cria um Iterador Interno aqui.
for(String name: names){
System.out.println(name);
}
}
}
Saída:-
Rams
Posa
Chinni
Exemplo de Iteração Bidirecional do ListIterator
Na seção, vamos explorar como os métodos do ListIterator funcionam para realizar iterações em Direção para Frente e Direção para Trás.
import java.util.*;
public class BiDirectinalListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// Obtendo ListIterator
ListIterator<String> listIterator = names.listIterator();
// Percorrendo elementos
System.out.println("Forward Direction Iteration:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// Percorrendo elementos, the iterator is at the end at this point
System.out.println("Backward Direction Iteration:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
Output:-
Forward Direction Iteration:
Rams
Posa
Chinni
Backward Direction Iteration:
Chinni
Posa
Rams
Tipos de Iteradores Java
Como sabemos, Java tem quatro cursores: Enumeração, Iterator, ListIterator e Spliterator. Podemos categorizá-los em dois tipos principais, conforme mostrado abaixo:
- Iteradores Uni-direcionais
São cursores que suportam apenas iterações em Direção para Frente. Por exemplo, Enumeração, Iterator, etc. são Iteradores Uni-direcionais.- Iteradores Bi-direcionais
São cursores que suportam tanto iterações em Direção para Frente quanto em Direção para Trás. Por exemplo, ListIterator é um Iterador Bi-direcional.
Como o ListIterator Java Funciona Internamente?
Como sabemos, o ListIterator Java trabalha em ambas as direções, ou seja, funciona na direção para frente e na direção para trás. É um Iterador Bidirecional. Para suportar essa funcionalidade, ele possui dois conjuntos de métodos.
- Métodos de Iteração em Direção para Frente
Precisamos usar os seguintes métodos para suportar a Iteração em Direção para Frente: `
- hasNext())
- next()
- nextIndex()
- Métodos de Iteração em Direção para Trás
Precisamos usar os seguintes métodos para suportar a Iteração em Direção para Trás: `
- hasPrevious()
- previous()
- previousIndex()
Em meu post anterior, já discutimos como um Iterator funciona internamente em Direção para Frente na seção “Como o Iterator do Java Funciona Internamente?”. Até mesmo o ListIterator também funciona da mesma maneira. Se você quiser ler meu post anterior, por favor clique aqui: Iterator Java. Nesta seção, discutiremos como o ListIterator funciona em Direção para Trás. Vamos usar o seguinte objeto LinkedList para entender essa funcionalidade. `
List<String> names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");
Agora crie um objeto ListIterator na LinkedList como mostrado abaixo: `
ListIterator<String> namesIterator = names.listLterator();
Vamos supor que o ListIterator “namesIterator” se pareça com o seguinte: ` Aqui, o Cursor do ListIterator está apontando antes do primeiro elemento da Lista. Agora, executamos o seguinte trecho de código no loop while. `
namesIterator.hasNext();
namesIterator.next();
Ao executarmos o trecho de código acima no loop while, o Cursor do ListIterator aponta para o último elemento na LinkedList. ` Então, podemos executar o seguinte trecho de código para começar a percorrer do final para o início.
namesIterator.hasPrevious();
namesIterator.previous();
Ao executarmos o trecho de código acima, o Cursor do ListIterator aponta para o “Penúltimo” elemento na Lista, conforme mostrado no diagrama acima. Execute este processo para posicionar o Cursor do ListIterator no primeiro elemento da LinkedList.
Após ler o primeiro elemento, se executarmos o trecho de código abaixo, ele retornará o valor “false”.
namesIterator.hasPrevious();
Como o Cursor do ListIterator aponta antes do primeiro elemento da LinkedList, o método hasPrevious() retorna um valor falso. Após observar todos esses diagramas, podemos afirmar que o Java ListIterator suporta iterações tanto na Direção Avançada quanto na Direção Reversa, como mostrado nos diagramas abaixo. Portanto, também é conhecido como Cursor Bidirecional. Direção Avançada do ListIterator
Direção Reversa do ListIterator
Vantagens do ListIterator
Ao contrário do Iterator, o ListIterator possui as seguintes vantagens:
- Assim como o Iterator, ele suporta operações de LEITURA e EXCLUSÃO.
- Também suporta operações de CRIAÇÃO e ATUALIZAÇÃO.
- Isso significa que ele suporta operações CRUD: operações de CRIAÇÃO, LEITURA, ATUALIZAÇÃO e EXCLUSÃO.
- Ele suporta tanto a iteração no sentido direto quanto no sentido inverso. Isso significa que é um Cursor Java Bidirecional.
- Os nomes dos métodos são simples e fáceis de usar.
Limitações do ListIterator
Comparado ao Iterator, o Java ListIterator tem muitas vantagens. No entanto, ainda possui algumas limitações a seguir.
- É uma implementação de lista apenas para classes de implementação de Iterator.
- Ao contrário do Iterator, não é aplicável para toda a API de Coleção.
- Não é um Cursor Java Universal.
- Comparado ao Spliterator, ele NÃO suporta iteração paralela de elementos.
- Comparado ao Spliterator, ele NÃO oferece melhor desempenho para iterar grandes volumes de dados.
Similaridades entre Iterator e ListIterator
Nesta seção, discutiremos as similaridades entre os dois Cursores Java: Iterator e ListIterator.
- Ambos foram introduzidos no Java 1.2.
- Ambos são Iteradores usados para iterar elementos de Coleção ou Lista.
- Ambos suportam operações de LEITURA e EXCLUSÃO.
- Ambos suportam iteração na direção para a frente.
- Ambos não são interfaces Legadas.
Diferenças entre Iterator e ListIterator
Nesta seção, discutiremos as diferenças entre os Dois Iteradores em Java: Iterator e 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. |
Isso é tudo sobre o ListIterator em Java. Espero que essas teorias e exemplos do ListIterator em Java ajudem você a começar com a programação usando o ListIterator. Referência: Documento API do ListIterator
Source:
https://www.digitalocean.com/community/tutorials/java-listiterator