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

此代碼將返回以下運行時異常跟蹤:如何刪除Set中的項目?

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

的Set實現meng.getExps的()是一個LinkedHashSet。

回答

7

對不起,你運氣不好:這個套件被包裹着Collections.unmodifiableCollection,這確實是這樣的:使得集合不可修改。你可以做的唯一的事情就是將內容複製到另一個Set中並使用它。

+0

有沒有像Collection.copy這樣的實用工具? – simpatico 2010-07-26 21:49:00

+1

例如Set set = new HashSet (exps); – Landei 2010-07-26 21:53:37

+0

@Landei是默認的java行爲,還是我們必須用Collections.unmodifiableCollection明確地包裝它。如果它是默認的,你知道在哪個版本的java中添加了這個改變嗎? – Atri 2016-08-09 23:18:47

4

你的獲得者明確地返回你一個UnmodifiableCollection,這是一個圍繞Sets排序的包裝,可以防止修改。

換句話說,API告訴你「這是我的收藏,請看看,但不要碰!」

如果你想修改它,你應該把它複製到一個新的Set中。有HashSet的複製構造函數非常適合此目的。