我有一个使用 Java HashMap 用邻接列表实现的有向图。Graph 类只存储这样的指针:
HashMap<Node<V>, List<Edge<V>>> graph;
我正在尝试编写一种可以执行图形转置的方法(通过副作用)。这是代码:
/**
* Helper method for connection test
*/
public void reverseDirection(){
for(Node<V> v : getNodes()){
for(Edge<V> e : getOutEdges(v)){
Node<V> target = e.getTarget();
int weight = e.getWeight();
graph.get(v).remove(e);
graph.get(target).add(new Edge<V>(v, weight));
}
}
}
在执行一些测试时,我得到了这个:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953)
at java.util.LinkedList$ListItr.next(LinkedList.java:886)
at esercitazione9.Graph.reverseDirection(Graph.java:71)
at esercitazione9.GraphUtil.fortementeConnesso(GraphUtil.java:126)
at esercitazione9.GraphUtil.main(GraphUtil.java:194)
Javadoc 说这个异常并不总是表明一个对象被同时修改了。即使线程在迭代集合时直接修改集合,它也可能发生。
这正是我的情况,但我没有解决它的想法。还有另一种方法可以在没有迭代器收集干扰的情况下反转所有边缘方向吗?注意:计算成本不能高于 O(n+m)。