ProjektGraph/graph/Graph.java

272 lines
6.5 KiB
Java
Raw Normal View History

2024-06-15 14:48:28 +00:00
package graph;
2024-07-03 17:41:46 +00:00
import OurApplication.OurLogElement;
import logging.LogElementList;
2024-06-25 15:18:34 +00:00
import java.util.*;
2024-06-15 14:48:28 +00:00
public abstract class Graph<T extends VertexMarking, U extends EdgeMarking> {
// ATTRIBUTE
2024-06-15 14:48:28 +00:00
private String name;
private Vector<MarkedVertex<T>> vertexes;
2024-06-25 15:18:34 +00:00
private Vector<MarkedEdge<U>> edges;
// KONSTRUKTOREN
2024-06-15 14:48:28 +00:00
public Graph() {
this.edges = new Vector<>();
this.vertexes = new Vector<>();
}
public Graph(String s) {
this();
this.name = s;
}
// GET-ER
public String getName() {
return this.name;
}
2024-06-25 15:18:34 +00:00
public Vector<MarkedEdge<U>> getAllEdges() {
return this.edges;
}
public Vector<MarkedVertex<T>> getAllVertexes() {
return this.vertexes;
}
2024-07-03 17:41:46 +00:00
public abstract visualizationElements.Graph getScreenGraph();
public abstract LogElementList<OurLogElement> getLogList();
// SET-ER
2024-06-15 14:48:28 +00:00
public void setName(String s) {
this.name = s;
}
// Ausgabe
2024-06-15 14:48:28 +00:00
public String toString() {
2024-06-26 00:20:36 +00:00
String output = "";
for (Vertex i: this.vertexes) {
output += i.toString();
output += "\n";
}
for (Edge i: this.edges) {
output += i.toString();
output += "\n";
}
return output;
2024-06-15 14:48:28 +00:00
}
// HINZUFÜGEN
// Kante hinzufügen
2024-06-25 15:18:34 +00:00
public void addEdge(MarkedEdge<U> e) {
2024-06-15 14:48:28 +00:00
this.edges.add(e);
}
// Knoten hinzufügen
2024-06-15 14:48:28 +00:00
public void addVertex(MarkedVertex<T> n) {
this.vertexes.add(n);
}
// LÖSCHEN
// Kante löschen
2024-06-25 15:18:34 +00:00
public void removeEdge(MarkedEdge<U> e) {
2024-06-15 14:48:28 +00:00
this.edges.remove(e);
}
public void removeEdge(String s) throws NameDoesNotExistException{
2024-06-25 15:18:34 +00:00
for (MarkedEdge<U> i: this.edges) {
2024-06-15 14:48:28 +00:00
if (Objects.equals(i.getName(), s)) {
2024-07-02 22:46:21 +00:00
this.removeEdge(i);
2024-06-15 14:48:28 +00:00
return;
}
}
throw new NameDoesNotExistException("One of the Edges might not exist");
}
// Knoten löschen
2024-06-15 14:48:28 +00:00
public void removeVertex(MarkedVertex<T> n) {
2024-06-25 15:18:34 +00:00
for (MarkedEdge<U> i: this.edges) {
if (i.getSource() == n || i.getDestination() == n) {
this.removeEdge(i);
}
}
2024-06-15 14:48:28 +00:00
this.vertexes.remove(n);
}
public void removeVertex(String s) throws NameDoesNotExistException{
for (MarkedVertex<T> i: this.vertexes) {
if (Objects.equals(i.getName(), s)) {
2024-07-02 22:46:21 +00:00
this.removeVertex(i);
2024-06-15 14:48:28 +00:00
return;
}
}
throw new NameDoesNotExistException("One of the Vertexes might not exist");
}
// GRAPH EIGENSCHAFTEN
2024-06-15 14:48:28 +00:00
// Kantenmenge
public int numberOfEdges() {
return this.edges.size();
2024-06-15 14:48:28 +00:00
}
// Knotenmenge
public int numberOfVertexes() {
return this.vertexes.size();
2024-06-15 14:48:28 +00:00
}
// Grad des Graphen
// https://loeh.app.uni-regensburg.de/teaching/discmath_ws0910/graphentheorie_ueberblick.pdf
public int degree() {
return 2 * this.edges.size();
2024-06-15 14:48:28 +00:00
}
// Prüfung, ob Knoten im Graph
public boolean hasVertex(MarkedVertex<T> n) {
return this.vertexes.contains(n);
2024-06-15 14:48:28 +00:00
}
public boolean hasVertex(String s) {
for (MarkedVertex<T> i: this.vertexes) {
if (Objects.equals(i.getName(), s)) {
return true;
}
}
return false;
}
// Prüfung, ob Kante im Graph
2024-06-25 15:18:34 +00:00
public boolean hasEdge(MarkedEdge<U> e) {
return this.edges.contains(e);
2024-06-15 14:48:28 +00:00
}
public boolean hasEdge(String s) {
2024-06-25 15:18:34 +00:00
for (MarkedEdge<U> i: this.edges) {
2024-06-15 14:48:28 +00:00
if (Objects.equals(i.getName(), s)) {
return true;
}
}
return false;
}
// KNOTEN EIGENSCHAFTEN
// Prüfung, ob Kante zwischen zwei Knoten
// TODO schauen, ob es Aufgabe entspricht
public boolean hasEdge(MarkedVertex<T> v1, MarkedVertex<T> v2) {
2024-06-25 15:18:34 +00:00
for (MarkedEdge<U> i: this.edges) {
if (i.getSource() == v1 && i.getDestination() == v2) {
return true;
} else if (i.getSource() == v2 && i.getDestination() == v1) {
return true;
}
}
return false;
2024-06-15 14:48:28 +00:00
}
public boolean hasEdge(String s1, String s2) throws NameDoesNotExistException {
MarkedVertex<T> n1 = null;
MarkedVertex<T> n2 = null;
for (MarkedVertex<T> i: this.getAllVertexes()) {
if (Objects.equals(i.getName(), s1)) {
n1 = i;
} else if (Objects.equals(i.getName(), s2)) {
n2 = i;
}
}
if (n1 == null || n2 == null) {
throw new NameDoesNotExistException("One of the Vertexes might not exist");
} else {
return hasEdge(n1, n2);
}
}
// Prüfung, ob zwei Knoten adjazent sind
public boolean areAdjacent(MarkedVertex<T> n1, MarkedVertex<T> n2) {
2024-06-25 15:18:34 +00:00
for (MarkedEdge<U> i: this.edges) {
if ((i.getSource() == n1 && i.getDestination() == n2) || (i.getSource() == n2 && i.getDestination() == n1)) {
2024-06-15 14:48:28 +00:00
return true;
}
}
return false;
}
public boolean areAdjacent(String s1, String s2) throws NameDoesNotExistException {
MarkedVertex<T> n1 = null;
MarkedVertex<T> n2 = null;
for (MarkedVertex<T> i: this.getAllVertexes()) {
if (Objects.equals(i.getName(), s1)) {
n1 = i;
} else if (Objects.equals(i.getName(), s2)) {
n2 = i;
}
}
if (n1 == null || n2 == null) {
throw new NameDoesNotExistException("One of the Vertexes might not exist");
} else {
return areAdjacent(n1, n2);
}
2024-06-15 14:48:28 +00:00
}
// Prüfung, ob Knoten eine Schlinge besitzt
2024-06-15 14:48:28 +00:00
public boolean hasLoop(MarkedVertex<T> n) {
2024-06-25 15:18:34 +00:00
for (MarkedEdge<U> i: this.edges) {
2024-06-15 14:48:28 +00:00
if (i.getSource() == i.getDestination() && i.getSource() == n) {
return true;
}
}
return false;
}
public boolean hasLoop(String s) throws NameDoesNotExistException{
for (MarkedVertex<T> i: this.vertexes) {
if (Objects.equals(i.getName(), s)) {
return hasLoop(i);
}
}
throw new NameDoesNotExistException("One of the Vertexes might not exist");
}
2024-06-25 15:18:34 +00:00
2024-07-03 17:41:46 +00:00
public abstract int getShortestPathDijkstra(MarkedVertex<T> n1, MarkedVertex<T> n2);
2024-07-03 19:49:51 +00:00
public abstract int getShortestPathAStar(MarkedVertex<T> n1, MarkedVertex<T> n2);
2024-06-15 14:48:28 +00:00
}