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

Обновить

November 2018

Просмотры

3.6k раз

7
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 ответы

4

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

Другими словами, API говорит вам «это моя коллекция, пожалуйста, смотрите, но не трогать!»

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

7

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