PDA

View Full Version : [Java] Domanda iterazione


mio81
22-11-2007, 14:39
Sto usando Java (ma vale anche per altri linguaggi tipo .NET).
Uso un costrutto tipo foreach o altri amenicoli tipo Iterator su una collezione di oggetti.

Se all'interno del ciclo vado a rimuovere un oggetto dalla collection (magari lo stesso oggetto obj su cui l'iterator mi sta facendo lavorare), rischio di incasinare il ciclo (o l'Iterator) stesso?

Se usassi un semplice for con contatore le cose le incasinerei non poco.

Esempio Java:

for(Object obj : setDiObject ) {

....
setDiObject.remove(obj);
....
}

Tnx.

andbin
22-11-2007, 14:46
Sto usando Java (ma vale anche per altri linguaggi tipo .NET).
Uso un costrutto tipo foreach o altri amenicoli tipo Iterator su una collezione di oggetti.

Se all'interno del ciclo vado a rimuovere un oggetto dalla collection (magari lo stesso oggetto obj su cui l'iterator mi sta facendo lavorare), rischio di incasinare il ciclo (o l'Iterator) stesso?Innanzitutto dovresti specificare bene quale collezione. Comunque le principali collezioni in java.util hanno iteratori di tipo "fail-fast". Vuol dire che se durante la iterazione la collezione viene modificata tramite un qualunque metodo che non è il remove() del Iterator (o add()/set() per ListIterator), al prossimo elemento iterato, viene lanciata la eccezione ConcurrentModificationException.

mio81
22-11-2007, 16:38
Effettivamente l'operazione nel caso di una linkedlist (ad esempio) dovrebbe essere meno "traumatica".

Comunque, tornando al mio caso :
(itero sugli entry di una Hashtable < K, MyObject >)

for( Map.Entry<K, MyObject> entry : hashtable.entrySet() )
{
...
if( condizione )
hashtable.remove(entry.getKey());
...
}

Mi salvo se il for si facesse una copia dell'EntrySet, e se non la fa, ci aggiungerò un clone(), giusto?
(sperando che il clone non sia troppo deep, ma non credo)