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

Bu kod aşağıdaki çalışma zamanı istisnaları iz döneceğini:Bir Set'ten öğe nasıl silinir?

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

meng.getExps seti uygulaması() bir LinkedHashSet olduğunu.

cevap

7

Üzgünüz, şansınız yok: Set tam olarak bunu yapan Collections.unmodifiableCollection ile sarılmış: koleksiyonu değiştirilemez hale getiriyor. Yapabileceğiniz tek şey içeriği başka bir Set'e kopyalamak ve bununla çalışmak.

+0

ve bunu yapmak için Collection.copy gibi bir yardımcı program var mı? – simpatico

+1

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

+0

@Landei bu varsayılan java davranışı mıdır, yoksa Collections.unmodifiableCollection ile açıkça sarmak zorunda mıyız? Varsayılan olarak, bu değişikliğin java hangi sürümde eklendiğini biliyor musunuz? – Atri

4

Alıcınız, değiştirmeyi engelleyen Set s boyutunda bir sarıcı olan UnmodifiableCollection'u açıkça size iade ediyor.

Diğer bir deyişle, API size "Bu benim koleksiyonum, lütfen bakın, ama dokunma!"

Değiştirmek isterseniz, bunu yeni bir Set'e kopyalamanız gerekir. Bu amaç için mükemmel olan HashSet için kopyalama kurucuları vardır.