使用JGraphT库的EdgeProvider类

时间:2017-06-19 23:50:23

标签: java generics graph graphviz jgrapht

我看起来全都是一个解决方案,但由于我对Java的通用编程风格没有多少经验,我有点难以用甚至用来搜索它的词。我正在尝试使用JGraphT库中的DOTImporter(http://jgrapht.org/javadoc/org/jgrapht/ext/DOTImporter.html),这反过来要求我使用EdgeProvider接口(http://jgrapht.org/javadoc/org/jgrapht/ext/EdgeProvider.html)。我已经尝试了很多方法来实现它,但buildEdge使用泛型返回类型的事实让我很困惑。我也试图使用他们的DefaultEdge(http://jgrapht.org/javadoc/org/jgrapht/graph/DefaultEdge.html)而且这并不是更好,因为他们的API指定了两个获取几个字段(源和目标)的方法,但没有办法设置这些字段,因为它们不是公共的,构造函数没有参数,我不太确定我应该如何设置它们。

为了对此进行上下文化,我试图加载一个.dot文件,我真正关心的是标签,所以我的图形实际上将由字符串顶点组成,因此边缘将是一个(字符串,字符串)结构也是如此。它真的非常简单,因此我不会半心半意地实现我自己的Graph结构来使用它,但我确实想要利用DOTImporter。

如果有人能就如何正确实现EdgeProvider的具体类以及如何使用DefaultEdge类提供一些帮助,我将非常感激。

1 个答案:

答案 0 :(得分:1)

简短回答:这是一个完整的DOTImporter示例(非常简单......):

public class DOTTest {

    public static void main(String[] args) throws ImportException {
        //Example graph
        String input =
                "digraph graphname {\r\n" + "     a -> b -> c;\r\n" + "     b -> d;\r\n" + " }";

        GraphImporter<String, DefaultEdge> importer = new DOTImporter<>(
                (label, attributes) -> label, 
                (from, to, label, attributes) -> new DefaultEdge()
        );

        Graph<String, DefaultEdge> result = new SimpleDirectedGraph<>(DefaultEdge.class);
        importer.importGraph(result, new StringReader(input));

        System.out.println(result);
    }
}

请注意,在JGraphT中,每个类都附带一个相应的测试类,其中包含许多示例。

更长的回答: 在JGraphT中,每个顶点和每个边都是一个对象。这允许非常灵活的图形。缺点是您需要提供工厂方法。例如,如果调用graph.addEdge(u,v),则必须创建一个新对象,该对象表示u和v之间的边缘。为此,需要边缘工厂。在许多实际情况中,用户不需要自定义边缘对象。对于这些情况,JGraphT提供DefaultEdge类。例如,当您构建表示道路网络的图形时,您希望拥有自定义边缘的实际示例。顶点是交叉点,边缘是街道。街道对象例如存储车道数,行驶速度,行驶方向等。

那么IntrusiveEdge的目的是什么?除非您打算为JGraphT贡献代码,否则这并不重要。您不应该直接使用IntrusiveEdge。 IntrusiveEdge是大多数边缘的基本类型。在引擎盖下,它存储边缘的源,目标和重量。但是,这些字段是隐藏的,即无法直接访问它们!相反,图类提供了访问这些字段的方法,例如, graph.getEdgeSource(myEdge)。

相关问题