2009-11-17 137 views
2

我想遍历所有节点,所以我可以将它们打印出来用于graphviz。使用JGraphT库的最佳方法是什么?Java:JGraphT:遍历节点

public static void main(String[] args) { 
    UndirectedGraph<String, DefaultEdge> g = new SimpleWeightedGraph<String, DefaultEdge>(DefaultEdge.class); 

    String odp = "ODP"; 
    String cck = "CCK"; 
    String mfe = "MFE"; 

    g.addVertex(odp); 
    g.addVertex(cck); 
    g.addVertex(mfe); 

    g.addEdge(odp, cck); 
    g.addEdge(odp, mfe); 

} 

另外,如何添加边权重?

编辑:这似乎工作得很好。但是有更好的方法吗?

Set<DefaultEdge> edges = g.edgeSet(); 

    for (DefaultEdge e : edges) { 
     gv.addln(String.format("\"%s\" -> \"%s\"", g.getEdgeSource(e), g.getEdgeTarget(e)));    
    } 

回答

0

尝试使用WeightedGraph代替UndirectedGraph(在回答你的第二个问题,关于添加的权重):

WeightedGraph<String, DefaultEdge> g = new SimpleWeightedGraph<String, DefaultEdge>(DefaultEdge.class); 

String odp = "ODP"; 
String cck = "CCK"; 
String mfe = "MFE"; 

g.addVertex(odp); 
g.addVertex(cck); 
g.addVertex(mfe); 

DefaultEdge e1 = g.addEdge(odp, cck); 
DefaultEdge e1 = g.addEdge(odp, mfe); 

g.setEdgeWeight(e1, 10); 
g.setEdgeWeight(e2, 4); 
0

而是由亚伦给出的代码中使用DefaultEdge的,你应该实际使用DefaultWeightedEdge

1

您可以使用图形上的功能toString()打印图表的所有信息,例如如果您有图形h,则可以执行此操作:

System.out.println(h.toString());

通过这种方式,您将看到一行中的图形。 在另一方面,你可以直观的图形坐标分配到vertexs,例如您的图表:

positionVertexAt(ODP, 130, 40); 
positionVertexAt(CCK, 60, 20); 
positionVertexAt(MFE, 240, 140); 

问题,那你必须实现一些功能,你在这个环节http://kickjava.com/src/org/jgrapht/demo/JGraphAdapterDemo.java.htm有一个例子。

我觉得有点困难,但你可以创建漂亮的图形可视化。

此外,您可以使用网络http://www.graphviz.org,您可以像您已经做过的那样格式化图形的信息,然后程序会生成图形,如果您键入此代码(如本例中的代码网络):

digraph finite_state_machine { 
rankdir=LR; 
size="8,5" 
node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; 
node [shape = circle]; 
LR_0 -> LR_2 [ label = "SS(B)" ]; 
LR_0 -> LR_1 [ label = "SS(S)" ]; 
LR_1 -> LR_3 [ label = "S($end)" ]; 
LR_2 -> LR_6 [ label = "SS(b)" ]; 
LR_2 -> LR_5 [ label = "SS(a)" ]; 
LR_2 -> LR_4 [ label = "S(A)" ]; 
LR_5 -> LR_7 [ label = "S(b)" ]; 
LR_5 -> LR_5 [ label = "S(a)" ]; 
LR_6 -> LR_6 [ label = "S(b)" ]; 
LR_6 -> LR_5 [ label = "S(a)" ]; 
LR_7 -> LR_8 [ label = "S(b)" ]; 
LR_7 -> LR_5 [ label = "S(a)" ]; 
LR_8 -> LR_6 [ label = "S(b)" ]; 
LR_8 -> LR_5 [ label = "S(a)" ]; 

}

该计划将建立这个图:http://www.graphviz.org/content/fsm

我写信给你这里的网址:http://www.graphviz.org/。 我希望我可以帮助你,如果我找到更多的信息或更容易我会告诉你。

Pd:对不起,我的英语我希望你能理解所有。

+0

这应该是接受的答案 – 2014-08-22 01:32:32