我一直在寻找解决方案,但是由于我对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文件,而我真正关心的只是标签,因此我的图形实际上将由String顶点组成,因此Edges也将是一个(String,String)结构。这确实非常简单,因此我不介意实现自己的Graph结构以用于此结构,但是我确实想利用DOTImporter。

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

最佳答案

简短的答案:这是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)。

09-08 03:57