从jgrapht中的节点获取所有边缘
Getting all edges going out from a node in jgrapht
我试图随机遍历 jgrapht 中的图形(直到找到某个目标节点)。为此,我需要从 sourceNode 开始,随机选择任何出现的边缘并跟随它。
我知道有一种方法 getAllEdges(sourceVertex, targetVertex)
returns 两个给定节点之间的所有边。但是,如何在只有源节点而没有目标节点的情况下获得所有边缘?
如果有人想知道,我没有找到任何直接的方法来实现这一点,所以我从评论中采纳了 Balkrishna 的建议。我的实现(Java 8 样式)是:
private List<WeightedEdge> getAllEdgesFromNode(TransportGraph graph, MyNode startNode) {
return graph.unwrap().edgeSet().stream()
.filter(weightedEdge -> graph.unwrap().getEdgeSource(weightedEdge).equals(startNode))
.collect(Collectors.toList());
}
注意:TransportGraph 是我自己编写的 jgrapht 图的包装器。我的方法 unwrap() returns SimpleDirectedWeightedGraph,
您可以直接使用Graphs.predecessorListOf和Graphs.successorListOf api。
任何实现接口 Graph<V,E>
的对象都应该有方法 edgesOf(V vertex)
,至少根据 API。您的 TransportGraph
应该可以做到这一点。
我想评论 milez 的答案,但我误把它写成了答案。
所以,让我们写下答案。
Milez 建议使用 JGrapht 库,我自己已经使用过几次并且工作得很好。
这个库有一个 RandomWalkIterator class 我认为符合要求。
您可以使用图对象的 outgoingEdgesOf
方法访问节点(顶点)的出边。
Set<MyEdge> edges = myGraph.outgoingEdgesOf(sourceNode);
此外,您可以使用 incomingEdgesOf
作为传入边。
如果要访问节点的所有边,请使用
graph.edgesOf(source)
我试图随机遍历 jgrapht 中的图形(直到找到某个目标节点)。为此,我需要从 sourceNode 开始,随机选择任何出现的边缘并跟随它。
我知道有一种方法 getAllEdges(sourceVertex, targetVertex)
returns 两个给定节点之间的所有边。但是,如何在只有源节点而没有目标节点的情况下获得所有边缘?
如果有人想知道,我没有找到任何直接的方法来实现这一点,所以我从评论中采纳了 Balkrishna 的建议。我的实现(Java 8 样式)是:
private List<WeightedEdge> getAllEdgesFromNode(TransportGraph graph, MyNode startNode) {
return graph.unwrap().edgeSet().stream()
.filter(weightedEdge -> graph.unwrap().getEdgeSource(weightedEdge).equals(startNode))
.collect(Collectors.toList());
}
注意:TransportGraph 是我自己编写的 jgrapht 图的包装器。我的方法 unwrap() returns SimpleDirectedWeightedGraph,
您可以直接使用Graphs.predecessorListOf和Graphs.successorListOf api。
任何实现接口 Graph<V,E>
的对象都应该有方法 edgesOf(V vertex)
,至少根据 API。您的 TransportGraph
应该可以做到这一点。
我想评论 milez 的答案,但我误把它写成了答案。 所以,让我们写下答案。 Milez 建议使用 JGrapht 库,我自己已经使用过几次并且工作得很好。 这个库有一个 RandomWalkIterator class 我认为符合要求。
您可以使用图对象的 outgoingEdgesOf
方法访问节点(顶点)的出边。
Set<MyEdge> edges = myGraph.outgoingEdgesOf(sourceNode);
此外,您可以使用 incomingEdgesOf
作为传入边。
如果要访问节点的所有边,请使用
graph.edgesOf(source)