15. Iteratori
Iterazioni sulle collezioni
Io voglio eseguire delle iterazioni su una collezione.
Se la collezione è di tipo List, allora posso usare un ciclo for
per accedere agli elementi della lista, attraverso l’indice di posizione.
Ma questa cosa non la posso fare su tutti i tipi di collezione!
Per questo motivo, sono stati introdotti degli oggetti speciali, chiamati iteratori: loro permettono di fare iterazioni in collezioni che non sono List.
Interfaccia Iterator
Presente in java.util
, è definita come:
public interface Iterator<E> {
public boolean hasNext();
public E next() throws NoSuchElementException;
public void remove(); // OPTIONAL
}
Interfaccia Iterable
Per standardizzare l’uso di iteratori, viene fornita anche l’interfaccia Iterable, presente in java.lang
.
Le classi che implementano questa interfaccia sono tipicamente collezioni che forniscono un metodo standard iterator()
, che viene usato per ottenere un oggetto di tipo Iterator
.
Per costruire una collezione che permette l’uso di iteratori, è necessario implementare questa interfaccia.
Esempio
// Esempio 1
public static boolean print(IntSet set){
for (Iterator<Integer> itr = set.elements(); itr.hasNext();)
System.out.println(itr.next());
}
public static boolean setPositive(IntSet set){
for (Iterator<Integer> itr = set.elements(); itr.hasNext();)
if (itr.next()<0) return false;
return true;
}
// Esempio 2
Iterator<String> iteratore = list.iterator();
while(iteratore.hasNext()){
string = iterator.next();//Elemento successivo
iterator.remove();//Rimuovi elemento corrente
}
Metodo remove()
Il metodo remove()
è opzionale e, se non viene implementato, viene invocata l’eccezione UnsupportedOperationException
quando viene invocato.
Questo metodo rimuove l’ultimo elemento che è stato ritornato dall’iteratore, però può essere chiamato una sola volta per ogni chiamata a next()
che è stata fatta e viene eseguito se la collezione non viene modificata in altri modi.
Altrimenti viene lanciata l’eccezione IllegalStateException
, se non abbiamo mai chiamato il metodo next()
o se abbiamo già chiamato remove()
dopo l’ultima next()
eseguita.