![]() ![]() |
|
Tipica operazione su di una collezione:
Esaminare tutti gli elementi, uno alla volta.Esempio: stampa, somma, ricerca, minimo, massimo, ... Per un vettore (o array) si usa un for:
Infatti sappiamo come accedere ad ogni elemento di un array o vettore con un indice. In generale, non sappiamo come accedere agli elementi di una collezione (ad es., liste concatenate, tabelle hash, alberi binari,...). Si introduce il concetto di iteratore, generalizzando la scansione lineare di un vettore. |
![]() ![]() |
|
Nel Java Collections Framework, gli iteratori
sono definiti dall'iterfaccia Iterator, [locale,
Medialab,
Sun],
dichiarata nella Java Collections API (package java.util):
La API fornisce una precisa specifica dei metodi:
|
![]() ![]() |
|
|
![]() ![]() |
|
|
![]() ![]() |
|
Come si ottiene un iteratore su una data collezione?
Invocando il metodo:E' dichiarato nell'interfaccia Collection [locale, Medialab, Sun], e quindi ogni classe che implementa questa interfaccia ne deve fornire una realizzazione. Esempio: Calcolo della dimensione di una qualunque
collezione
Si noti che l'esecuzione di next() nella guardia ha due effetti:
|
![]() ![]() |
|
L'iteratore restituito dal metodo iterator
ci consente di scandire e/o cancellare i dati della collezione. E' possibile
avere più iteratori sulla stessa collezione (con l'uso delle classi
interne).
Cosa succede se durante la scansione la collezione viene modificata (da un altro iteratore o da altri metodi sulla collezione? Esempio: Modifica concorrente con due iteratori:
Se eseguiamo it1.next()
deve essere lanciata una eccezione di tipo ConcurrentModificationException,
perché la vera causa del fallimento è una modifica concorrente
(non
qualcosa come NoSuchElementException).
|
![]() ![]() |
|
![]() ![]() |
In che ordine vengono esaminati gli elementi di
una collezione con un iteratore?
Dipende da come sono realizzati i metodi dell'iteratore.L'iteratore standard della classe Vector scandisce gli elementi dalla posizione 0 fino alla posizione size()-1.
Soluzione: RevVectIterator Soluzione: RevVector
Nel main costruire un oggetto di Vector ed uno di RevVector, riempiendoli con gli stessi elementi, e invocare printCollection su entrambi, per verificare l'ordine in cui vengono stampati gli elementi. Soluzione: PrintCollection |