グラフの要約手法を実装しようとしています。ノードの子要素があるかどうかをチェックします。そうでない場合、ノードは親要素に折りたたまれます。 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である元のグラフのコピーを保持しながら変更するグラフです。
してください実際のコードを投稿したことを確認してください。現在、いくつかの構文エラーがあります。 –
コード – Kira
を更新しましたか?私もJgraphtを使用しようとしています。http://stackoverflow.com/questions/40306916/com-android-jack-ir-ast-jreturnstatement-at-unknown-source-info –