0

オブジェクトの無向グラフを設定するアルゴリズムを書いています。グラフ内の特定の要素にエッジを正しく追加および削除した後、このエラーが発生する特定のポイントに到達します。

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 が返されることがわかりました。なぜこうなった?

4

1 に答える 1

2

ここでは、mGraph がどのように設定されているかは述べていません。エントリのいずれかが変更不可能なセットである場合 (特にそれらが他のデータ構造のビューである場合)、そのエラー メッセージが表示される可能性があります。多くの開発者にとって残念なことに、Java コレクション クラスに対する多くの操作はオプションであり、実装者でさえサポートされていない可能性があります。Collections.unmodifiableCollection は読み取り専用ビューを返し、そのメソッドは他のコレクション (Map.keySet など) のビューによく使用されます。

HashSet インスタンスのみが mGraph に配置されるようにするには、ソース セットからnew HashSet<Object>andを明示的に作成するか、コンストラクターを使用します。addAllnew HashSet<Object>(existingSet)

于 2015-07-07T21:34:13.093 に答える