2016-10-25 5 views
0

J'essaie d'implémenter une sorte de technique de résumé de graphique, où je vérifie si un nœud a des enfants ou non, sinon, le nœud est replié dans son parent. J'ai 2 extraits de code pour le faire, mais l'un d'entre eux ne fonctionne pas en raison d'un bug dans getEdgeSource, ou du moins je le pense. Lors de l'utilisation de la 1ère implémentation, je peux marquer les nœuds qui doivent être repliés, après quoi je boucle à nouveau tous les nœuds du graphique et les ajoute à leur parent respectif, puis je les supprime. Cela fonctionne parfaitement. L'autre extrait de code doit faire la même chose, mais les noeuds ne sont pas ajoutés au parent, ils sont seulement supprimés. Voici les extraits ci-dessous: Tout d'abord voici ma classe Node:La mise à jour du graphique JGraphT ne fonctionne pas correctement

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(); 
    } 
} 

(Code de travail mais plus la complexité du temps):

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); 
      } 
     } 
    } 
} 

(Le code qui devrait fonctionner, mais ne fonctionne pas):

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); 
      } 
     } 
    } 

} 

le graphique n'a pas d'auto-boucles, le diagramme graphique je modifie tout en conservant une copie du graphe original qui est graphCopy.

+0

S'il vous plaît assurez-vous que vous avez posté votre code réel. Il y a quelques erreurs de syntaxe actuellement. –

+0

J'ai mis à jour le code – Kira

+0

pouvez-vous m'aider? J'essaie d'utiliser Jgrapht aussi http://stackoverflow.com/questions/40306916/com-android-jack-ir-ast-jreturnstatement-at-unknown-source-info –

Répondre

0

Vous n'avez pas fourni le code pour votre classe Edge, mais avec DefaultEdge pour la classe de bord, vos deux implémentations de travail oneLevelCollapse (...) et passera ce test unitaire:

public void testJgraph() { 
    DirectedGraph<Node, DefaultEdge> graph = new SimpleDirectedGraph<>(DefaultEdge.class); 
    Node v1 = new Node("a"); 
    Node v2 = new Node("b"); 
    Node v3 = new Node("c"); 
    graph.addVertex(v1); 
    graph.addVertex(v2); 
    graph.addVertex(v3); 

    graph.addEdge(v1, v2); 
    graph.addEdge(v2, v3); 

    oneLevelCollapse(graph); 

    assertEquals(2, graph.vertexSet().size()); 
    assertTrue(graph.vertexSet().contains(v1)); 
    assertTrue(graph.vertexSet().contains(v2)); 
    assertEquals(v3, v2.children.get(0)); 

}