问题标签 [jgrapht]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1341 浏览

java - 如何在 Java 中制作 Treelayout 图

我正在开发一个读取一些 xml 文件并根据这些 xml 文件中的信息创建图表的程序。

我在制作图表时遇到了困难。我希望我的图表看起来: http: //pic.dhe.ibm.com/infocenter/elixent/v3r5/topic/com.ibm.ilog.elixir.doc/Content/Visualization/Documentation/Flex/Diagram4Flex/_media/ TreeLayoutExample_default.png

所以,我希望它有一个树形布局,顶点的名称在一些彩色矩形内(对于不同类型的项目,首选有不同的颜色),我还希望在两个顶点之间的边缘上写一些文字。最重要的是,我非常希望顶点是我在项目中创建的一些对象,因此当我单击顶点以获取放置在顶点上的对象的实例时。

到目前为止,我尝试了两个框架来轻松绘制我的图形,而无需在绘图算法上做太多工作:

起初我尝试了 jgraph 框架:

}

该框架在制作图形时效果很好,顶点名称在矩形内,边上命名,并且可以在使用 MouseListener 单击顶点时获取顶点内的字符串。

但是我找不到一种方法让它具有 TreeLayout 并将顶点添加为一些我可能会在单击 Vertex 时返回的对象。我尝试使用此示例中的泛型类,但在尝试运行它时只得到异常。我在 Internet 上搜索,但找不到在此 Graph 上应用树形布局的方法

我也尝试过 Java JUNG 框架,它有更多用于绘制图形的选项。我找到了这个例子:

}

使用这个框架,我可以将顶点添加为我创建的一些对象,并在顶点名称上显示该对象在 toString() 方法中返回的内容。它还实现了我非常想要的 TreeLayout 算法,但我无法改变顶点的外观。我希望它们看起来像 JGraph 框架绘制的顶点,但是使用 JUNG 我只能得到一些圆圈,并且顶点的名称在顶点形状之外。我发现了一个改变顶点形状的例子,但文字仍在外面。

所以,我非常想要一些关于如何绘制一些介于这两个框架之间的图形的建议:在形状内有顶点的名称,有 Treelayout 并将顶点添加为一些我可以得到的对象当我点击顶点时返回。

Marco13 的回答非常有用。我想通过为矩形的宽度设置 String.length * 10 来使矩形具有适合字符串的大小。

我认为这对于尝试制作这样的图形的其他人可能有用:在此示例中,可以使用任何需要的对象,而不是出现在大多数通用类中,String 用于 Vertex,Integer 用于 Edge 类型。在 Transformer 函数中,您可以获得分配给顶点或边的对象。像这样,我可以为具有某些特定属性的对象设置不同的形状、颜色和字体。

我努力弄清楚如何制作一个当我单击它时返回边缘对象的 MouseListener,但我希望这会很容易。

0 投票
1 回答
1305 浏览

java - 在 JGraphT SimpleGraph 中使用相等的顶点

在 Java 中,想要创建一个包含相等顶点/边的简单图(未加权、无向图,不包含图循环或多条边)。

我有两个 Java 类,一个用于顶点:

还有一个边缘类:

我目前使用JGraphT 库IllegalArgumentException: "loops not allowed"但是我在启动这段代码后遇到了:

问题是我尝试添加v2到图表中,但因为v1.equals(v2) == true v2从未添加到图表中。来自 lib 的 JavaDoc:

如果指定的顶点尚不存在,则将其添加到该图中。更正式地说,如果该图不包含满足 u.equals(v) 的顶点 u,则将指定的顶点 v 添加到该图中。

此检查在此处实施。

但是,我该如何完成我想要做的事情呢?我可以在这个库中使用另一个实现,还是改变equals()方法是个好主意?

0 投票
0 回答
139 浏览

java - 创建数据库模式的目录 (Java)

有了这个问题,我希望得到一些想法来开始解决我的“问题”。

所以,我需要“编目”一个数据库模式:所有存在的,以及它们之间的关系。我正在开发我的项目JAVA,所以我想继续它。我想,在我拥有那个目录之后,用一些表名查询它,并获取它们之间的关系。我的想法是有一种Graph,其中 Vertexes 是 DB Tables,而 Edges 显示它们之间的关系。我开始看JGraphT library。但是有可能将一些信息“分配”到边缘吗?

图表只是一个起点。如果你能建议我使用另一种结构,我会很高兴“听到”更多的选择。

0 投票
1 回答
521 浏览

java - 通过指定根和叶从图中获取树

我正在查看 jgrapht 和 jung 但我似乎找不到任何方法可以让我做我想做的事。

我有一个图表,通过指定一个根节点和一些叶子,我想从中获取一棵树,或者如果这不可能,至少是一个错误。

jgraphT 和 jung 似乎都具有从图中获得最小生成树的算法,但是获得的树是随机的,没有人向我保证给定节点将是叶子节点,而另一个节点将是中继节点....

0 投票
0 回答
388 浏览

java - jGraphT DirectedWeightedMultigraph中的相等顶点

我想要一个带有“自定义”顶点和边的 DirectedWeightedMultigraph。使用此代码,我希望只有三个顶点,因为 v1 和 v4 具有相同的键,但我有四个。

这就是我的顶点的样子:

}

我的边缘看起来像

}

在使用边之前,我阅读了这篇关于顶点和边的等号和哈希码的文章。我也尝试使用 ParanoidGraph 但它不起作用。为了解决这个问题,我选择在添加顶点之前“手动”检查具有特定键的顶点是否在顶点集中。但我想念我的代码有什么问题。我还有四个顶点:

0 投票
1 回答
1166 浏览

java - 如何使用 JGraphT 引用自定义顶点来添加边

我有一个图SimpleWeightedGraph<Vertex, DefaultWeightedEdge> g,其中 Vertex 是一个自定义类。我在 postgresql 空间数据库中拥有所有顶点和边缘。
我只需要加载其中的一个子集,就可以从两个顶点中找到一条路径,所以我使用了一些查询。

Vertex 类有一个Stringas 标识符和我从 db 加载的其他参数。我以后需要它们。

我首先用一些查询加载所有需要的顶点。在第二次我添加边(与其他查询),但我需要参考已经在图中的顶点。

现在的问题是:我怎样才能做到这一点?

这是我的代码的一些摘录。

Vertex 类:(
如果 Vertex 具有相同的 id,我希望它们是相等的,并且它们按照它们的 id 以字符串的相同自然顺序排序。我希望它也是可能的vertex.equals("something")


提取代码的另一部分,我在其中创建图的顶点:


现在我需要创建边缘。这是代码:


我也试过:


但这不起作用:当我添加边时,源和目标顶点(已经在图中)会丢失除 id 之外的所有参数。

我如何参考它们?谢谢。

0 投票
1 回答
653 浏览

java - 通过传递闭包计算 DAG 中最近的顶点邻居

考虑一个有向图,如下所示:

在此处输入图像描述

其中,(A) 最初,实心黑色边缘被断言:

  • 0 → {1,3}
  • 1 → {2}
  • 3 → {4}
  • 4 → {2}

然后 (B)然后计算传递闭包以添加以下(虚线)边:

  • 0 → {2,4}
  • 3 → {2}

对于此最终图中的任何顶点,我如何有效地计算某些边缘可访问的“直接”邻居,而这些边缘无法通过不同的更长路径访问?我想要的输出显示在(A)中。我没有区分断言(粗体)或推断(虚线)的边缘。

这个问题有一个众所周知的名字吗,有没有用JGraphT实现这个问题的直接方法?


想法:

也许这可以通过使用顶点的拓扑排序来实现,例如TS = [0,1,3,4,2]

基本上,我认为 (v0 → v1) 是一个解决方案,当拓扑排序中的 v0 > v2 > v1 不再存在其他路径 (v0 → ... v2 ... → v1) 时。这看起来是否正确,和/或是否有更有效的方法?

0 投票
1 回答
653 浏览

jgrapht - 两个图表之间的相等失败..怎么来的?

我试图简单地等于两个 jgraphT 实例,它返回 false,即使它们是相同的。然后我尝试用我的实现覆盖等号:

并看到如果该边不是 EXACT 对象,则 containsEdge() 方法将失败。这很奇怪,因为我确保覆盖边缘和开关的 equals 方法......

编辑:做了这个实验:

如您所见, containsVertex() 方法似乎不起作用..

edit2:感谢愚蠢的怪胎,我几乎解决了:我也必须覆盖 hashcode() 方法。现在,这适用于顶点,但对于边缘,我在哈希码上得到一个空指针异常,这是我重写的方法:

当我尝试在图上创建一条边时,我得到一个空指针(我想这里调用了 hashcode()):

问题是 getSource() 和 getTarget() 在那一刻调用时似乎返回 null ......如何解决?这是异常堆栈:

java.util.HashMap.hash(HashMap.java:366) 的 org.at.network.types.CustomE.hashCode(CustomE.java:71) 的线程“main”java.lang.NullPointerException 异常。 HashMap.getEntry(HashMap.java:466) at java.util.HashMap.containsKey(HashMap.java:453) at org.jgrapht.graph.Abs​​tractBaseGraph.containsEdge(AbstractBaseGraph.java:359) at org.jgrapht.graph.Abs​​tractBaseGraph org.jgrapht.graph.DefaultListenableGraph.addEdge(DefaultListenableGraph.java:162) 在 org.at.network 的 org.jgrapht.graph.GraphDelegator.addEdge(GraphDelegator.java:131) 的 .addEdge(AbstractBaseGraph.java:208)。 types.MyGraph.addCustomEdge(MyGraph.java:27) 在 org.at.network.Test.main(Test.java:220)

addcustomedge 方法如下:

端口只是几个字符串的简单数据结构。

0 投票
2 回答
3961 浏览

java - 使用 jgrapht 自定义边缘

我想定义一个自定义边缘

但是当我尝试使用时,super()这可能吗?创建图表时我应该为 EdgeFactory 使用什么?

这足够了吗?或者我应该创建一个也扩展的新类EdgeFactory

0 投票
1 回答
4908 浏览

java - 如何在 JPanel 上绘制 SimpleWeightedGraph?

我有一个 SimpleWeightedGraph,我想在 JFrame 中的 JPanel 上绘制它。不幸的是,什么也没画。

我读了这篇文章。他们正在使用a ListenableDirectedGraph,所以我尝试了a ListenableUndirectedGraph,但没有成功。