2015-06-16 3 views
4

Я пытаюсь случайно перемещаться по графику в jgrapht (пока не найду какой-то целевой узел). Чтобы сделать это, мне нужно начать с источникаNode, произвольно выбрать любой выходящий край и следовать ему.Получение всех ребер из узла в jgrapht

Я знаю, что существует метод getAllEdges(sourceVertex, targetVertex), который возвращает все ребра между двумя заданными узлами. Но как я могу получить все ребра, имея только sourceNode, без целевого?

+0

Невозможно увидеть какой-либо прямой API для этого. То, что вы можете сделать, это либо 1. получить все вершины (возможно, используя метод 'vertexSet()'), а затем передать каждую вершину из этого набора как 'targetVertex' для метода' getAllEdges() 'и объединить результаты всех этих вызовов , или 2. получить все ребра, используя метод edgeSet(). Затем для каждого из этих ребер вызовите 'getEdgeSource (E e)', чтобы получить sourceVertext. Затем сравните его с указанной вершиной, чтобы увидеть, начинается ли это ребро из данной вершины. Соберите эти края и получите желаемый результат. –

+0

Это, вероятно, будет работать, но насколько это эффективно? У меня довольно большой график для анализа. – Niemand

+0

Если вы обеспокоены производительностью, так как не существует API-интерфейса, я предлагаю вам взглянуть на источник, а затем расширить класс, чтобы создать собственную реализацию, например, getAllEdgesStartingFromVertex (V vertex) , Это также позволяет оптимизировать метод так, как вы хотите. –

ответ

3

Вы можете использовать Graphs.predecessorListOf и Graphs.successorListOf apis напрямую.

1

В случае, если кто-то задается вопросом, я не нашел прямого способа достичь этого, поэтому я пошел с предложением Балкришны из комментариев. Моя реализация (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 графа я написал сам. Мой метод распаковывает() возвращает SimpleDirectedWeightedGraph,

0

Любой объект, который реализует интерфейс Graph<V,E>, должен иметь способ edgesOf(V vertex), по крайней мере, согласно API. Ваш TransportGraph должен уметь это сделать.

-2

Я пытался прокомментировать милюз, но я ошибочно написал это как ответ. Итак, давайте напишем ответ. Милец предложил использовать библиотеку JGrapht, которую я использовал несколько раз и отлично работает. В этой библиотеке есть класс RandomWalkIterator, который, как мне кажется, соответствует требованиям.

+0

Извините, это было сделано для того, чтобы быть комментарием к ответу на милю, и это пошло не в то место. Виноват. Мильц предложил библиотеку JGrapht, которая имеет класс RandomWalkIterator. На мой взгляд, он реализует точно запрошенные функции. – Juan