Java:JGraphT:遍历节点

时间:2009-11-17 01:34:15

标签: java graph iteration jgrapht

我正在尝试遍历所有节点,因此我可以将它们打印出来用于graphviz。使用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)));            
    }

3 个答案:

答案 0 :(得分:1)

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

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

通过这种方式,您将看到一行中的图表。 另一方面,您可以将图形分配给顶点的坐标可视化,例如使用图表:

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:对不起我的英语,我希望你能理解所有。

答案 1 :(得分: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);

答案 2 :(得分:0)

您应该使用DefaultEdge

而不是在Aaron给出的代码中使用DefaultWeightedEdge
相关问题