java - 如何从不可变集转换为哈希集?

标签 java graph set undirected-graph

我正在编写一个算法来建立对象的无向图。在正确地向图中的特定元素添加和删除边之后,我到达了出现此错误的某个点。

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$UnmodifyingSet。为什么会发生这种情况?

最佳答案

这里你没有说 mGraph 是如何填充的。如果任何条目是不可修改的集——特别是如果它们是某些其他数据结构的 View ——那么它可能会导致该错误消息。令许多开发人员懊恼的是,Java 集合类上的许多操作都是可选的,甚至对于实现者来说也可能不受支持。 Collections.unmodifyingCollection 返回只读 View ,该方法通常用于其他集合(例如 Map.keySet)的 View 。

为了确保只有 HashSet 实例放入 mGraph,显式创建 new HashSet<Object>addAll从源集中,或使用 new HashSet<Object>(existingSet)构造函数。

关于java - 如何从不可变集转换为哈希集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31279495/

相关文章:

java - 使用 ProcessBuilder 应用程序没有响应

python-rrdtool,如何在 UTC 时区创建图表

python - 如何在不转换为无向图的情况下在有向图中查找子图?

java - 批处理运行java,找不到类

java - 从服务器获取 505 响应

graph - 不同大小的簇邻接矩阵

c++ - boost 是否具有比 STL 更简单的集合操作数据类型?

c++如何从函数正确返回对象

C++,如何从迭代器返回对成员变量的引用

java - java中没有任何代码的情况下无限运行while循环