Как преобразовать неизменный набор в хэш-сет?
Я пишу алгоритм для настройки неориентированного графа объектов. После правильного добавления и удаления ребер для определенных элементов на графике я достигаю определенной точки, где я получаю эту ошибку.
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
at UndirectedGraph.addEdge(UndirectedGraph.java:81)
Обратите внимание, что это после того, как программа уже позволила мне добавлять ребра на график, и ничего не изменилось в способе ввода объектов в метод addEdge. Код для addEdge:
private final Map<Object, Set<Object>> mGraph = new HashMap<Object, Set<Object>>();
public void addEdge(Object one, Object two) {
/* Confirm both endpoints exist. */
if (!mGraph.containsKey(one) || !mGraph.containsKey(two))
throw new NoSuchElementException("Both nodes must be in the graph.");
/* Add the edge in both directions. */
mGraph.get(one).add(two);
mGraph.get(two).add(one);
}
Во время работы отладчика я обнаружил, что в начале кода, когда вызывается mGraph.get (one), он возвращает HashSet, но при возникновении ошибки он возвращает Collections$UnmodifiableSet. Почему это происходит?
1 ответ
Вы не говорите здесь, как населен mGraph. Если какие-либо записи являются неизменяемыми наборами - особенно если это представления некоторых других структур данных - тогда это может вызвать это сообщение об ошибке. К сожалению многих разработчиков, многие операции над классами коллекций Java являются необязательными и могут не поддерживаться даже разработчиками. Collections.unmodifiableCollection возвращает представления только для чтения, и этот метод часто используется для представлений других коллекций (например, Map.keySet).
Чтобы убедиться, что в mGraph помещаются только экземпляры HashSet, явно создайте new HashSet<Object>
а также addAll
из исходного набора или используйте new HashSet<Object>(existingSet)
конструктор.