Skip to content

Commit 034d71d

Browse files
authored
Merge pull request #5782 from kcacademic/graphs-java
BAEL-2334: Adding file for the tutorial on Graph in Java
2 parents 866666f + 7410f52 commit 034d71d

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.baeldung.graph;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.stream.Collectors;
8+
9+
public class Graph {
10+
private Map<Vertex, List<Vertex>> adjVertices;
11+
12+
Graph() {
13+
this.adjVertices = new HashMap<Vertex, List<Vertex>>();
14+
}
15+
16+
void addVertex(String label) {
17+
adjVertices.putIfAbsent(new Vertex(label), new ArrayList<>());
18+
}
19+
20+
void removeVertex(String label) {
21+
Vertex v = new Vertex(label);
22+
adjVertices.values().stream().map(e -> e.remove(v)).collect(Collectors.toList());
23+
adjVertices.remove(new Vertex(label));
24+
}
25+
26+
void addEdge(String label1, String label2) {
27+
Vertex v1 = new Vertex(label1);
28+
Vertex v2 = new Vertex(label2);
29+
adjVertices.get(v1).add(v2);
30+
adjVertices.get(v2).add(v1);
31+
}
32+
33+
void removeEdge(String label1, String label2) {
34+
Vertex v1 = new Vertex(label1);
35+
Vertex v2 = new Vertex(label2);
36+
List<Vertex> eV1 = adjVertices.get(v1);
37+
List<Vertex> eV2 = adjVertices.get(v2);
38+
if (eV1 != null)
39+
eV1.remove(v2);
40+
if (eV2 != null)
41+
eV2.remove(v1);
42+
}
43+
44+
List<Vertex> getAdjVertices(String label) {
45+
return adjVertices.get(new Vertex(label));
46+
}
47+
48+
String printGraph() {
49+
StringBuffer sb = new StringBuffer();
50+
for(Vertex v : adjVertices.keySet()) {
51+
sb.append(v);
52+
sb.append(adjVertices.get(v));
53+
}
54+
return sb.toString();
55+
}
56+
57+
class Vertex {
58+
String label;
59+
Vertex(String label) {
60+
this.label = label;
61+
}
62+
@Override
63+
public boolean equals(Object obj) {
64+
Vertex vertex = (Vertex) obj;
65+
return vertex.label == label;
66+
}
67+
@Override
68+
public int hashCode() {
69+
return label.hashCode();
70+
}
71+
@Override
72+
public String toString() {
73+
return label;
74+
}
75+
}
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.graph;
2+
3+
import java.util.LinkedHashSet;
4+
import java.util.LinkedList;
5+
import java.util.Queue;
6+
import java.util.Set;
7+
import java.util.Stack;
8+
9+
import com.baeldung.graph.Graph.Vertex;
10+
11+
public class GraphTraversal {
12+
static Set<String> depthFirstTraversal(Graph graph, String root) {
13+
Set<String> visited = new LinkedHashSet<String>();
14+
Stack<String> stack = new Stack<String>();
15+
stack.push(root);
16+
while (!stack.isEmpty()) {
17+
String vertex = stack.pop();
18+
if (!visited.contains(vertex)) {
19+
visited.add(vertex);
20+
for (Vertex v : graph.getAdjVertices(vertex)) {
21+
stack.push(v.label);
22+
}
23+
}
24+
}
25+
return visited;
26+
}
27+
28+
static Set<String> breadthFirstTraversal(Graph graph, String root) {
29+
Set<String> visited = new LinkedHashSet<String>();
30+
Queue<String> queue = new LinkedList<String>();
31+
queue.add(root);
32+
visited.add(root);
33+
while (!queue.isEmpty()) {
34+
String vertex = queue.poll();
35+
for (Vertex v : graph.getAdjVertices(vertex)) {
36+
if (!visited.contains(v.label)) {
37+
visited.add(v.label);
38+
queue.add(v.label);
39+
}
40+
}
41+
}
42+
return visited;
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.graph;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
public class GraphTraversalUnitTest {
7+
@Test
8+
public void givenAGraph_whenTraversingDepthFirst_thenExpectedResult() {
9+
Graph graph = createGraph();
10+
Assert.assertEquals("[Bob, Rob, Maria, Alice, Mark]",
11+
GraphTraversal.depthFirstTraversal(graph, "Bob").toString());
12+
}
13+
14+
@Test
15+
public void givenAGraph_whenTraversingBreadthFirst_thenExpectedResult() {
16+
Graph graph = createGraph();
17+
Assert.assertEquals("[Bob, Alice, Rob, Mark, Maria]",
18+
GraphTraversal.breadthFirstTraversal(graph, "Bob").toString());
19+
}
20+
21+
Graph createGraph() {
22+
Graph graph = new Graph();
23+
graph.addVertex("Bob");
24+
graph.addVertex("Alice");
25+
graph.addVertex("Mark");
26+
graph.addVertex("Rob");
27+
graph.addVertex("Maria");
28+
graph.addEdge("Bob", "Alice");
29+
graph.addEdge("Bob", "Rob");
30+
graph.addEdge("Alice", "Mark");
31+
graph.addEdge("Rob", "Mark");
32+
graph.addEdge("Alice", "Maria");
33+
graph.addEdge("Rob", "Maria");
34+
return graph;
35+
}
36+
}

0 commit comments

Comments
 (0)