2010-09-28 16 views
8

Vorrei eseguire un'iterazione su un Set e rimuovere gli elementi dal set che corrispondono ad alcune condizioni. Il numero documentation of iterator non dice nulla sulla modifica dell'elenco durante l'iterazione su di esso.Java Set iterator, sicuro per la rimozione di elementi?

È possibile? In caso contrario, quale sarebbe il modo migliore per farlo? Si noti che voglio solo rimuovere elementi dal set forniti da Iterator.

Modifica: rapidamente è stato dimostrato che ciò è possibile. Posso farlo anche con la seguente sintassi?

for(Node n : mySet) { 
    mySet.remove(n); 
} 
+0

"Posso farlo anche con la seguente sintassi?". No. – Thilo

risposta

16

Sì, è possibile utilizzare l'iteratore per rimuovere l'elemento corrente in modo sicuro:

iterator.remove(); 

La javadoc di remove() dice:

Rimuove l'elemento specificato da questo insieme se è presente (operazione opzionale). Più formalmente, rimuove un elemento e tale che (o == null? E == null: o.equals (e)), se questo insieme contiene tale elemento. Restituisce true se questo insieme contiene l'elemento (o, in modo equivalente, se questo set è cambiato in seguito alla chiamata). (Questo set non conterrà l'elemento una volta che la chiamata ritorna.)


risposta alla tua domanda successiva: No, non puoi. La modifica di un set durante l'iterazione su di esso con un ciclo for perfezionato causerà uno ConcurrentModificationException.

+1

E questo è l'unico modo per modificare la raccolta mentre si sta iterando. Qualsiasi altra cosa ti darà una ConcurrentModificationException. – Thilo

+0

Grazie !!!!!!!!! –

1

La risposta di tangens è corretta. Se non si utilizza iterator.remove(), ma rimuove direttamente dal set, si riceverà una chiamata un'eccezione ConcurrentModificationException

0

Questo ist quello .Rimuovere() fa:

http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove%28%29

"Rimuove dal raccolta sottostante l'ultimo elemento restituito dall'iteratore (operazione facoltativa) .Questo metodo può essere chiamato solo una volta per chiamata a successiva.Il comportamento di un iteratore non è specificato se la raccolta sottostante viene modificata mentre l'iterazione è in corso in un modo diverso da chiamando questo metodo. "

-1

per (Nodo n: mySet) { mySet.remove (n); }

non funziona poiché si modifica il set che si sta iterando. Questo tuttavia può essere fatto solo utilizzando l'iteratore, il che non è il caso in questo modo.

Questo è uno svantaggio dell'utilizzo di loop avanzati.

0

Questo è effettivamente migliorato in Java 8. Ora si può solo

mySet.removeIf(element -> someConditionMatches());

Quanto sopra è implementato come un metodo default in java.util.Collection e dovrebbe salvare tutti dalla scrittura cicli noiosi. Detto questo, dovrebbe funzionare per qualsiasi tipo di raccolta e non solo per Set.

Problemi correlati