2016-10-25 13 views
0

グラフの要約手法を実装しようとしています。ノードの子要素があるかどうかをチェックします。そうでない場合、ノードは親要素に折りたたまれます。 2つのコードスニペットがありますが、そのうちの1つはgetEdgeSourceのバグのために動作していないか、少なくとも私はそう考えています。最初の実装を使用する場合、折りたたむ必要があるノードにタグを付けてから、グラフのすべてのノードをループしてから、それぞれの親ノードにノードを追加してから削除します。これは完全に機能します。他のコードスニペットは同じことを行う必要がありますが、ノードは親に追加されず、削除されるだけです。ここでは、スニペットは、怒鳴る、次のとおりです。ここで まず私のNodeクラスは次のとおりです。JGraphTグラフの更新が正しく機能していない

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

} 

グラフには自己ループがありません。graphは、graphCopyである元のグラフのコピーを保持しながら変更するグラフです。

+0

してください実際のコードを投稿したことを確認してください。現在、いくつかの構文エラーがあります。 –

+0

コード – Kira

+0

を更新しましたか?私もJgraphtを使用しようとしています。http://stackoverflow.com/questions/40306916/com-android-jack-ir-ast-jreturnstatement-at-unknown-source-info –

答えて

0

あなたはoneLevelCollapse(...)のあなたの実装の両方が動作し、このユニットテストをパスしますが、DefaultEdgeとエッジクラスの、あなたのエッジクラスのコードを提供していませんでした:

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

} 
関連する問題