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.