我看起来全都是一个解决方案,但由于我对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类提供一些帮助,我将非常感激。
答案 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)。