0

私のグラフは一連の頂点を保持し、各頂点には番号、隣接する頂点のリスト、および訪問されたかどうかのインジケーターがあります。私のコードはグラフのエッジを逆にする必要がありますが、CurrentModificationException をスローします。どうしたの?

public void reverse() {

        Vertex initialVertex = vertices.get(1);
        reverseVertex(initialVertex);
    }

    public void reverseVertex(Vertex initialV) {

        initialV.setVisitedForReverse(true);
        ArrayList<Vertex> neighbors = new ArrayList<Vertex>();
        for( Vertex v : initialV.getAdjacent()) {
            if( !v.isVisitedForReverse() ) {
                neighbors.add(v);
                v.getAdjacent().add(initialV);
                initialV.getAdjacent().remove(v);
            }
        }
        for(Vertex vert : neighbors) 
            reverseVertex(vert);
    }
4

3 に答える 3

0

コードにとってパフォーマンスが重要でない場合は、1 つのループで隣接ノードにアクセスし (隣接リストからノードを削除しないでください)、別のループで隣接リストからノード (隣接リストに追加されたノード) を削除します。

于 2013-02-28T09:05:19.677 に答える
0

for-each ループを使用すると、反復処理中にコレクションを変更することはできません。

Iterator を明示的に使用することを検討してください。イテレータがremove()操作をサポートしていると仮定すると(チェックしてください)、これはうまくいくはずです:

Iterator<Vertex> it = initialV.getAdjacent().iterator();
while (it.hasNext()) {
    if (...)
        it.remove();
}

ただし、私の回答はループの専門性にのみ言及しています。反転ロジックが正しく、データ構造の一貫性が保たれていることを確認する必要があります。

于 2013-02-26T10:06:44.673 に答える
0

頂点のリストを繰り返し処理し、同時にそれを変更しているため

于 2013-02-26T09:56:42.480 に答える