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

Dieser Code würde kehrt die folgende Laufzeit Ausnahmen verfolgen:Wie lösche ich einen Gegenstand aus einem Set?

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

Die Set-Implementierung von meng.getExps() ein LinkedHashSet ist.

Antwort

7

Entschuldigung, Sie haben kein Glück: Das Set wurde mit Collections.unmodifiableCollection verpackt, was genau das macht: die Sammlung nicht änderbar. Das einzige, was Sie tun können, ist den Inhalt in ein anderes Set zu kopieren und damit zu arbeiten.

+0

und gibt es irgendein Dienstprogramm wie Collection.copy, das zu tun? – simpatico

+1

Zum Beispiel Set set = neue HashSet (exps); – Landei

+0

@Landei ist es das Standard-Java-Verhalten oder müssen wir es explizit mit Collections.unmodifiableCollection umbrechen. Wenn es standardmäßig ist, weißt du, in welcher Version von Java diese Änderung hinzugefügt wurde? – Atri

4

Ihr Getter gibt Ihnen explizit eine UnmodifiableCollection, die eine Art Wrapper um Set s ist, die Änderung verhindert.

Mit anderen Worten, die API sagt Ihnen, "das ist meine Sammlung, bitte schauen, aber nicht berühren!"

Wenn Sie es ändern möchten, sollten Sie es in ein neues Set kopieren. Es gibt Kopierkonstruktoren für HashSet, die für diesen Zweck groß sind.

Verwandte Themen