Я пытаюсь реализовать своего рода метод суммирования графа, где я проверяю, есть ли у узла какие-либо дочерние элементы или нет, если нет, то узел сворачивается в своего родителя. У меня есть 2 фрагмента кода для этого, но один из них не работает из-за ошибки в getEdgeSource, по крайней мере, я так думаю. При использовании 1-й реализации я могу пометить узлы, которые должны быть свернуты, после этого я снова перебираю все узлы в графе и добавляю их к соответствующему родителю, а затем удаляю их. Это работает отлично. Другой фрагмент кода должен делать то же самое, но узлы не добавляются к родителю, а только удаляются. Вот фрагменты ниже: Сначала мой класс Node:
public class Node implements Serializable{
private static final long serialVersionUID = 1L;
public String nodeID;
public String timestamp;
public ArrayList<Node> children = new ArrayList<Node>();
public boolean tagged;
public boolean isRoot;
public Node(String a) {
nodeID = a;
}
public void addChild(Node a){
children.add(a);
}
public int getSize(){
return children.size();
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Node)) {
return false;
}
Node other = (Node) obj;
return this.nodeID.equals(other.nodeID);
}
@Override
public int hashCode() {
return nodeID.hashCode();
}
}
(Рабочий код, но более сложная по времени):
public void oneLevelCollapse(DirectedGraph<Node, Edge> graph) {
graphCopy = (DirectedGraph<Node, Edge>) ((AbstractBaseGraph<Node, Edge>)graph).clone();
// iterate over every node and tag nodes to collapse
for (Node node : graphCopy.vertexSet()) {
// remove node if it has no children and only one parent
if (graphCopy.outDegreeOf(node) == 0 && graphCopy.inDegreeOf(node) == 1) {
node.tagged = true;
}
}
// iterate over every node again and collapse/delete
for (Node node : graphCopy.vertexSet()) {
for (Edge edge : graphCopy.outgoingEdgesOf(node)) {
Node child = graph.getEdgeTarget(edge);
if (child.tagged) {
node.addChild(child);
graph.removeVertex(child);
}
}
}
}
(Код, который должен работать, но не работает):
public void oneLevelCollapse(DirectedGraph<Node, Edge> graph) {
graphCopy = (DirectedGraph<Node, Edge>) ((AbstractBaseGraph<Node, Edge>)graph).clone();
// iterate over every node and tag nodes to collapse
for (Node node : graphCopy.vertexSet()) {
// remove node if it has no children and only one parent
if (graphCopy.outDegreeOf(node) == 0 && graphCopy.inDegreeOf(node) == 1) {
for (Edge edge : graphCopy.incomingEdgesOf(node)) {
graph.getEdgeSource(edge).addChild(node);
graph.removeVertex(node);
}
}
}
}
График не имеет циклов, график — это график, который я изменяю, сохраняя при этом копию исходного графика, который называется graphCopy.