Обмен узлом в Guava MutableValueGraph

Я пытаюсь заменить элемент в com.google.common.graph.MutableValueGraph .

Мне нужно обновить состояние элемента (что-то, о чем я знаю, что документы рекомендуют соблюдать) в следующем классе данных:

 data class Frame(val method: String, val merged: Boolean = false) 

Поскольку графики не предлагают метод обмена узлом для другого, я откатил свой собственный:

 fun MutableValueGraph<Frame, Int>.exchangeNode(old: Frame, new: Frame): Boolean { if (old == new) return true if (isDirected) { this.predecessors(old).forEach { this.putEdgeValue(it, new, this.edgeValue(it, old)) } this.successors(old).forEach { this.putEdgeValue(new, it, this.edgeValue(old, it)) } } else { this.adjacentNodes(old).forEach { this.putEdgeValue(it, new, this.edgeValue(it, old)) } } return this.removeNode(old) } 

Однако я попал в ConcurrentModificationException:

 Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437) at java.util.HashMap$EntryIterator.next(HashMap.java:1471) at java.util.HashMap$EntryIterator.next(HashMap.java:1469) at com.google.common.graph.DirectedGraphConnections$1$1.computeNext(DirectedGraphConnections.java:113) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:145) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:140) at TestKt.exchangeNode(Test.kt:292) ... 

Звучит справедливо, когда я обмениваюсь кучей узлов в цикле for, вероятно, пытаюсь прикоснуться к соседнему узлу, который уже был обменен?

Мой вопрос: как заменить несколько узлов в ValueGraph, сохраняя их значения границ?

    Менее эффективный подход, но тот, который, безусловно, должен избегать ConcurrentModificationException заключается в том, чтобы вызвать подграф из соответствующих узлов, а затем удалить старый узел и добавить новый и, наконец, использовать индуцированный подграф, чтобы добавить значения края обратно:

     fun MutableValueGraph<Frame, Int>.exchangeNode(old: Frame, new: Frame): Boolean { if (old == new) return false val inducedSubgraph = Graphs.inducedSubgraph(this, adjacentNodes(old) + old) removeNode(old) addNode(new) if (isDirected) { for (predecessor in inducedSubgraph.predecessors(old)) { putEdgeValue(predecessor, new, inducedSubgraph.edgeValue(predecessor, old)) } for (successor in inducedSubgraph.successors(old)) { putEdgeValue(new, successor, inducedSubgraph.edgeValue(old, successor)) } } else { for (adjacentNode in inducedSubgraph.adjacentNodes(old)) { putEdgeValue(adjacentNode, new, inducedSubgraph.edgeValue(adjacentNode, old)) } } return true }