javagraph-traversaljgraphtjgraph

How to iterate Graph and list all connections with org.jgrapht


I am attempting to employ

compile group: 'org.jgrapht', name: 'jgrapht-core', version: '1.1.0'

To visualise relationships between Teams and Team Members.

For example:-

"Team One" has members "Team Member A", "Team Member B", "Team Member C"

"Team Two" has members "Team Member C", "Team Member D"

So I add the following vertexes

final Graph<Displayable, DefaultEdge> directedGraph = new DefaultDirectedGraph<>(DefaultEdge.class);

directedGraph.addVertex(team_0001);
directedGraph.addVertex(team_0002);
directedGraph.addVertex(teamMember_A);
directedGraph.addVertex(teamMember_B);
directedGraph.addVertex(teamMember_C);
directedGraph.addVertex(teamMember_D);

directedGraph.addEdge(team_0001, teamMember_A);
directedGraph.addEdge(team_0001, teamMember_B);
directedGraph.addEdge(team_0001, teamMember_C);
directedGraph.addEdge(team_0002, teamMember_C);
directedGraph.addEdge(team_0002, teamMember_D);

When I iterate through this graph I would like the following output:-

Team_0001
  teamMember_A
  teamMember_B
  teamMember_C

Team_0002
  teamMember_C
  teamMember_D

How can I achieve this?

Do I have to develop a customer graph Iterator?


Solution

  • Your graph is, by definition, bipartite: {Partition 1=Team vertices, Partition 2= player vertices}.

    So simply maintain a list of Team vertices, and for each vertex invoke Graphs.neighborListOf(.):

    List<Displayable> teams=...; for(Displayable v : teams) System.out.println("Team"+v+" has the following members: "+Graphs.neighborListOf(teamGraph,v);

    Alternatively, since your graph is directed, you can iterate over the edges:

    for(DefaultEdge e : teamGraph.edgeSet()) System.out.println(String.format("Player %s belongs to team %s",teamGraph.getEdgeTarget(e), teamGraph.getEdgeSource(e)));