2010-07-26 16 views
7
final Set<Expression> exps = meng.getExps(); 
Iterator<Expression> iterator = exps.iterator(); 
final Expression displayedExp = exps.iterator().next(); 
exps.remove(displayedExp); 

Questo codice sarebbe tornato le seguenti eccezioni runtime traccia:Come eliminare un elemento da un set?

null 
java.lang.UnsupportedOperationException 
     at java.util.Collections$UnmodifiableCollection.remove(Collections.java:1021) 

L'implementazione Set di meng.getExps() è una LinkedHashSet.

risposta

7

Siamo spiacenti, sei sfortunato: il Set è stato imballato con Collections.unmodifiableCollection, che fa esattamente questo: rendere la collezione non modificabile. L'unica cosa che puoi fare è copiare il contenuto in un altro Set e lavorare con questo.

+0

e c'è qualche utilità come Collection.copy per farlo? – simpatico

+1

E.g. Set set = new HashSet (exps); – Landei

+0

@Landei è il comportamento java predefinito o dobbiamo includerlo esplicitamente con Collections.unmodifiableCollection. Se è di default, sai in quale versione di java è stata aggiunta questa modifica? – Atri

4

Il tuo getter ti restituisce esplicitamente un UnmodifiableCollection, che è un involucro di tipo intorno a Set s che impedisce la modifica.

In altre parole, l'API ti dice "questa è la mia collezione, per favore guarda ma non toccare!"

Se si desidera modificarlo, è necessario copiarlo in un nuovo Set. Ci sono costruttori di copia per HashSet che sono grandi per questo scopo.

Problemi correlati