Как удалить элемент из набора?

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 () является LinkedHashSet.

2 ответов


Извините, вам не повезло: набор был завернут с сборники.unmodifiableCollection, который делает именно это: делает коллекцию немодифицируемой. Единственное, что вы можете сделать, это скопировать содержимое в другой набор и работать с этим.


ваш геттер явно возвращает вам UnmodifiableCollection, который является оберткой вокруг всякие Sets, который предотвращает модификацию.

другими словами, API говорит вам: "это моя коллекция, пожалуйста, смотрите, но не трогайте!"

Если вы хотите изменить его, вы должны скопировать его в новый набор. Существуют копирующие конструкторы для HashSet это отлично подходит для этой цели.