如何从Set中删除项目?

时间:2010-07-26 21:41:35

标签: java collections

final Set<Expression> exps = meng.getExps();
Iterator<Expression> iterator = exps.iterator();
final Expression displayedExp = exps.iterator().next();
exps.remove(displayedExp);

此代码将返回以下运行时异常跟踪:

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

meng.getExps()的Set实现是一个LinkedHashSet。

3 个答案:

答案 0 :(得分:7)

抱歉,你运气不好:Set被Collections.unmodifiableCollection包裹着,这正是这样做的:使收藏品无法修改。您唯一能做的就是将内容复制到另一个Set中并使用它。

答案 1 :(得分:4)

你的getter明确地返回一个UnmodifiableCollection,它是Set周围的排序包装,阻止修改。

换句话说,API告诉你“这是我的收藏,请看但不要碰!”

如果要修改它,则应将其复制到新的Set中。 HashSet的复制构造函数非常适用于此目的。

答案 2 :(得分:0)

您将您的 Set 声明为“final”,这意味着它不能被修改。你得到的错误是正常的。

如果要更改 Set 的内容,请删除“final”。