Как преобразовать неизменный набор в хэш-сет?

Я пишу алгоритм для настройки неориентированного графа объектов. После правильного добавления и удаления ребер для определенных элементов на графике я достигаю определенной точки, где я получаю эту ошибку.

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) конструктор.

Другие вопросы по тегам