У меня есть ориентированный граф, реализованный с помощью списков смежности с использованием 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).
По этой причине я прошу альтернативного решения. –