Java 从jgrapht中的节点获取所有边

Java 从jgrapht中的节点获取所有边,java,graph,jgrapht,jgraph,Java,Graph,Jgrapht,Jgraph,我试图在jgrapht中随机遍历图形(直到找到某个目标节点)。要做到这一点,我需要从sourceNode开始,随机挑选出任何一条边,然后跟随它 我知道有一个方法getAllEdges(sourceVertex,targetVertex)返回两个给定节点之间的所有边。但是,我如何在只有sourceNode而没有目标节点的情况下获得所有边呢?如果有人想知道,我没有找到任何直接的方法来实现这一点,所以我采纳了Balkrishna的评论建议。我的实现(Java 8风格)是: 私有列表getAllEdge

我试图在jgrapht中随机遍历图形(直到找到某个目标节点)。要做到这一点,我需要从sourceNode开始,随机挑选出任何一条边,然后跟随它


我知道有一个方法
getAllEdges(sourceVertex,targetVertex)
返回两个给定节点之间的所有边。但是,我如何在只有sourceNode而没有目标节点的情况下获得所有边呢?

如果有人想知道,我没有找到任何直接的方法来实现这一点,所以我采纳了Balkrishna的评论建议。我的实现(Java 8风格)是:

私有列表getAllEdgesFromNode(TransportGraph图,MyNode startNode){
返回graph.unwrap().edgeSet().stream()
.filter(weightedEdge->graph.unwrap().getEdgeSource(weightedEdge).equals(startNode))
.collect(Collectors.toList());
}

注意:TransportGraph是我自己编写的JGraph图的包装器。我的方法unwrap()返回SimpleDirectedWeightedGraph,

您可以直接使用Graphs.predecessorListOf和Graphs.successorListOf API

实现接口
图形的任何对象应具有方法
边(V顶点)
,至少根据。你的
TransportGraph
应该能够做到这一点。

我试图对米雷斯的答案进行评论,但我错误地将其作为答案。 那么,让我们写下答案。 Milez建议使用JGrapht库,我已经使用过好几次了,效果很好。
这个库有一个我认为符合要求的RandomWalkIterator类。

您可以使用graph对象的
outgoingEdgesOf
方法访问节点(顶点)的输出边

Set<MyEdge> edges = myGraph.outgoingEdgesOf(sourceNode);

看不到任何用于执行此操作的直接API。你可以做的是1。获取所有顶点(可能使用
vertexSet()
方法),然后将此集合中的每个顶点作为
targetVertex
传递给方法
getAllEdges()
并合并所有这些调用的结果。或2。使用
edgeSet()
方法获取所有边。然后,为每个边调用
getEdgeSource(ee)
以获取sourceVertext。然后将其与给定顶点进行比较,查看此边是否从给定顶点开始。收集这些边,你就会得到你想要的结果。它可能会起作用,但这有多有效?我有一个很大的图要分析。如果你关心性能,因为没有现成的API,我建议你看看源代码,然后扩展类来创建你自己的实现,比如getAllEdgesStartingFromVertex(V vertex)。这也可以让你以你想要的方式优化方法。对不起,这是对米雷斯答案的评论,但它放错了地方。我的错误。milez提出了JGrapht库,它有一个RandomWalkIterator类。在我看来,它完全实现了所请求的功能。
Set<MyEdge> edges = myGraph.outgoingEdgesOf(sourceNode);
graph.edgesOf(source)