I am building a Graph class to learn and eventually plan to add Dijkstra's algorithm to this implementation. What do you think of the overall approach? Any feedback on how to improve this?
Vertex.java - contains all vertex information
public class Vertex {
int key;
String name;
protected Vertex(String name, int key) {
this.name = name;
this.key = key;
}
protected int getKey() {
return this.key;
}
protected void setKey(int key) {
this.key = key;
}
protected String getName() {
return this.name;
}
}
Graph.java - edges are directed
public class MyGraph {
HashMap<String, Vertex> vertexes = new HashMap<>();
List<HashSet<Vertex>> adjList = new LinkedList<>();
int index = 0;
public void addVertex(String name) {
if (!vertexes.containsKey(name)) {
Vertex v = new Vertex(name, index);
vertexes.put(name, v);
index++;
adjList.add(new HashSet<>());
} else {
System.out.println("Vertex " + name + " already exists in graph.");
}
}
// v1 has directed edge towards v2
public void addEdge(String name1, String name2) {
// are both vertexes already in the graph?
if (!vertexes.containsKey(name1) || !vertexes.containsKey(name2)) {
System.out.println("Please enter vertexes that already exist in the graph.");
return;
}
Vertex source = getVertex(name1);
Vertex destination = getVertex(name2);
// does edge already exist?
int key = source.getKey();
if (adjList.get(key).contains(destination)) {
System.out.println("Edge from " + name1 + " to " + name2 + " already exists.");
return;
} else {
adjList.get(key).add(destination);
}
}
// removes all vertexes/edges from graph
public void clear() {
vertexes = new HashMap<>();
adjList = new LinkedList<>();
index = 0;
}
public HashSet<Vertex> getNeighbors(String name) {
Vertex v = getVertex(name);
Iterator iterator = adjList.get(v.getKey()).iterator();
HashSet neighbors = new HashSet();
while (iterator.hasNext()) {
neighbors.add(iterator.next());
}
return neighbors;
}
private Vertex getVertex(String name) {
return vertexes.get( name);
}
public boolean isEmpty() {
return index == 0 && vertexes.isEmpty() && adjList.isEmpty();
}
public void removeEdge(String name1, String name2) {
if (!containsVertex(name1) || !containsVertex(name2)) {
System.out.println("Please check your inputs: at least one is invalid and dne in graph.");
return;
}
Vertex v1 = getVertex(name1);
Vertex v2 = getVertex(name2);
adjList.get(v1.getKey()).remove(v2);
}
public void removeVertex(String name) {
// before removing vertex
// iterate over this.adjList
// 1. remove all neighbors (hashset) from this.adjList
// 2. need to remove all incoming edges from other vertexes
// 3. update keys for all vertexes that come after one to be removed
// 4. remove from HashMap this.vertices
// 5. index--;
if (!containsVertex(name)) {
System.out.println("Vertex does not exist.");
return;
}
Vertex v = getVertex(name);
int key = v.getKey();
// remove vertex neighbors list from adjacency list
adjList.remove(key);
// remove references to vertex as a neighbor
Iterator adjListIterator = adjList.iterator();
while (adjListIterator.hasNext()) {
HashSet neighborList = (HashSet) adjListIterator.next();
if (neighborList.contains(v)) {
neighborList.remove(v);
}
}
// update keys for all vertexes that come after this
if (key < size() - 1) {
Iterator vertexIterator = vertexes.values().iterator();
while (vertexIterator.hasNext()) {
Vertex vertex = (Vertex) vertexIterator.next();
int vertexKey = vertex.getKey();
if (vertexKey > key) {
vertex.setKey(vertexKey-1);
}
}
}
vertexes.remove(name);
index--;
}
// returns the number of vertexes
public int size() {
return vertexes.size();
}
public boolean containsVertex(String name) {
Vertex v = getVertex(name);
return (v != null && adjList.get(v.getKey()) != null);
}
}