Java - Come utilizzare Iterator?
Spesso, vorrai scorrere gli elementi in una raccolta. Ad esempio, potresti voler visualizzare ogni elemento. Il modo più semplice per farlo è utilizzare un iteratore, che è un oggetto che implementa l'interfaccia Iterator o ListIterator.
Iterator ti consente di scorrere una raccolta, ottenendo o rimuovendo elementi. ListIterator estende Iterator per consentire l'attraversamento bidirezionale di un elenco e la modifica degli elementi.
Prima di poter accedere a una raccolta tramite un iteratore, è necessario ottenerne uno. Ciascuna delle classi di raccolta fornisce un metodo iterator () che restituisce un iteratore all'inizio della raccolta. Utilizzando questo oggetto iteratore, è possibile accedere a ogni elemento della raccolta, un elemento alla volta.
In generale, per utilizzare un iteratore per scorrere i contenuti di una raccolta, segui questi passaggi:
Ottieni un iteratore all'inizio della raccolta chiamando il metodo iterator () della raccolta.
Imposta un ciclo che effettui una chiamata a hasNext (). Fai in modo che il ciclo esegua l'iterazione finché hasNext () restituisce true.
All'interno del ciclo, ottieni ogni elemento chiamando next ().
Per le raccolte che implementano List, è anche possibile ottenere un iteratore chiamando ListIterator.
I metodi dichiarati da Iterator
Sr.No. | Metodo e descrizione |
---|---|
1 | boolean hasNext( ) Restituisce vero se sono presenti più elementi. In caso contrario, restituisce false. |
2 | Object next( ) Restituisce l'elemento successivo. Genera NoSuchElementException se non è presente un elemento successivo. |
3 | void remove( ) Rimuove l'elemento corrente. Genera IllegalStateException se viene effettuato un tentativo di chiamare remove () che non è preceduto da una chiamata a next (). |
I metodi dichiarati da ListIterator
Sr.No. | Metodo e descrizione |
---|---|
1 | void add(Object obj) Inserisce obj nell'elenco davanti all'elemento che verrà restituito dalla successiva chiamata a next (). |
2 | boolean hasNext( ) Restituisce vero se c'è un elemento successivo. In caso contrario, restituisce false. |
3 | boolean hasPrevious( ) Restituisce vero se è presente un elemento precedente. In caso contrario, restituisce false. |
4 | Object next( ) Restituisce l'elemento successivo. Se non è presente un elemento successivo, viene generata un'eccezione NoSuchElementException. |
5 | int nextIndex( ) Restituisce l'indice dell'elemento successivo. Se non è presente un elemento successivo, restituisce la dimensione dell'elenco. |
6 | Object previous( ) Restituisce l'elemento precedente. Se non è presente un elemento precedente, viene generata un'eccezione NoSuchElementException. |
7 | int previousIndex( ) Restituisce l'indice dell'elemento precedente. Se non è presente un elemento precedente, restituisce -1. |
8 | void remove( ) Rimuove l'elemento corrente dall'elenco. Viene lanciata un'eccezione IllegalStateException se remove () viene chiamato prima di next () o previous (). |
9 | void set(Object obj) Assegna obj all'elemento corrente. Questo è l'ultimo elemento restituito da una chiamata a next () o previous (). |
Esempio
Ecco un esempio che mostra sia Iterator che ListIterator. Utilizza un oggetto ArrayList, ma i principi generali si applicano a qualsiasi tipo di raccolta.
Ovviamente ListIterator è disponibile solo per quelle raccolte che implementano l'interfaccia List.
import java.util.*;
public class IteratorDemo {
public static void main(String args[]) {
// Create an array list
ArrayList al = new ArrayList();
// add elements to the array list
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
// Use iterator to display contents of al
System.out.print("Original contents of al: ");
Iterator itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
// Modify objects being iterated
ListIterator litr = al.listIterator();
while(litr.hasNext()) {
Object element = litr.next();
litr.set(element + "+");
}
System.out.print("Modified contents of al: ");
itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
// Now, display the list backwards
System.out.print("Modified list backwards: ");
while(litr.hasPrevious()) {
Object element = litr.previous();
System.out.print(element + " ");
}
System.out.println();
}
}
Questo produrrà il seguente risultato:
Produzione
Original contents of al: C A E B D F
Modified contents of al: C+ A+ E+ B+ D+ F+
Modified list backwards: F+ D+ B+ E+ A+ C+