# Graph (1_graphentester)

Package graph

## Class Graph

- java.lang.Object
- - graph.Graph

    public class Graph
    extends Object

Dies ist das Herz vom "GraphTester" - der Graph selber, gepeichert als Adjazenzliste. Die Klasse erlaubt durch geeignete Methoden: - die Speicherung als Adjazenzmatrix, - das Hinzufuegen und Loeschen von knoten und Kanten, - das Markieren von Knoten und Kanten, - eine Aussage darueber, ob Knoten oder Kanten enthalten sind und - eine Ausgabe des Graphen in textueller Form sowie als csv-Datei.

Version:
  31.01.2021 (v6.5)
Author:
  Dirk Zechnall, Thomas Schaller

### Constructor Summary

Constructors
`Graph()` Der Konstruktor erstellt einen neuen ungerichteten, ungewichteten Graphen (genauer eine neue Adjazenzliste)
`Graph​(boolean isGerichtet, boolean isGewichtet)` Der Konstruktor erstellt einen neuen Graphen (genauer eine neue Adjazenzliste)

### Method Summary

All Methods Instance Methods Concrete Methods
`void` `ausgabe()` Konsolenausgabe der textuellen Repraesentation des Graphen.
`void` `entferneKante​(int startnr, int zielnr)` Entfernt eine Kante aus dem Graphen.
`void` `entferneKante​(Kante e)` Entfernt eine Kante aus dem Graphen.
`void` `entferneKante​(Knoten start, Knoten ziel)` Entfernt eine Kante aus dem Graphen.
`void` `entferneKnoten​(int knotennr)` Entfernt einen Knoten aus dem Graphen
`boolean` `entferneKnoten​(Knoten k)` Entfernt einen Knoten aus dem Graphen
`void` `entferneMarkierungBeiAllenKnoten()` Entfernt die Markierung bei allen Knoten des Graphen.
`double[][]` `getAdjazenzMatrix()` Die Methode getAdjazenzMatrix() gibt die Adjazenzmatrix zurueck.
`List<Kante>` `getAlleKanten​(Predicate<Kante>... filter)` Gibt eine Liste aller Kanten des Graphen zurück.
`List<Knoten>` `getAlleKnoten​(Predicate<Knoten>... filter)` Gibt eine Liste aller Knoten des Graphen zurueck.
`int` `getAnzahlKnoten()` Gibt die Anzahl der Knoten im Graph zurueck
`List<Kante>` `getAusgehendeKanten​(int knotennr, Predicate<Kante>... filter)` Gibt eine Liste der ausgehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist.
`List<Kante>` `getAusgehendeKanten​(Knoten k, Predicate<Kante>... filter)` Gibt eine Liste der ausgehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist.
`List<Kante>` `getEingehendeKanten​(int knotennr, Predicate<Kante>... filter)` Gibt eine Liste der eingehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist.
`List<Kante>` `getEingehendeKanten​(Knoten k, Predicate<Kante>... filter)` Gibt eine Liste der eingehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist.
`Kante` `getKante​(int startnr, int zielnr)` Gibt eine gesuchte Kante aus dem Graphen zurueck.
`Kante` `getKante​(Knoten start, Knoten ziel)` Gibt eine gesuchte Kante aus dem Graphen zurueck.
`Knoten` `getKnoten​(int knotennr)` Liefert einen Knoten des Graphen
`String` `getKnoteninfo​(Knoten k, boolean zeigeWert)` Info über einen Knoten zurückgeben
`List<Knoten>` `getNachbarknoten​(Knoten k, Predicate<Knoten>... filter)` Gibt die Liste aller Nachbarknoten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist.
`int` `getNummer​(Kante k)` Gibt die Nummer einer Kante zurück
`int` `getNummer​(Knoten k)` Gibt die Nummer eines Knotens im Graphen zurück
`List<String>` `getStatus()` Speichert den Zustand des Graphen als String-List
`void` `initialisiereAlleKanten()` Initialisiert alle Kanten des Graphen.
`void` `initialisiereAlleKnoten()` Initialisiert alle Knoten des Graphen.
`boolean` `isGerichtet()` Gibt zurueck, ob der Graph gerichtet oder ungerichtet ist.
`boolean` `isGewichtet()` Gibt zurueck, ob der Graph gewichtet oder ungewichtet ist
`boolean` `isKanteEnthalten​(int startNr, int zielNr)` Ueberprueft, ob eine Kante im Graphen enthalten ist.
`boolean` `isKanteEnthalten​(Kante e)` Ueberprueft, ob eine Kante im Graphen enthalten ist.
`boolean` `isKanteEnthalten​(Knoten start, Knoten ziel)` Ueberprueft, ob eine Kante im Graphen enthalten ist.
`boolean` `isKnotenEnthalten​(Knoten k)` Ueberprueft, ob ein Knoten in der Knotenliste enthalten ist.
`boolean` `isLeer()` Ueberprueft, ob die Adjazenzliste leer ist, d.h. keine Knoten im Graphen enthalten sind.
`boolean` `ladeGraph​(Table csvParser)` Ein Graph wird aus einer csv-Datei erstellt, die entweder eine Matrix oder eine Adjazenzliste enthält, die den Graph beschreibt.
`void` `loescheAlles()` Loescht den gesamten Graphen
`void` `loescheGraph()` Löscht alle Knoten und Kanten eines Graphen und stellt auf ungerichtet und ungewichtet zurück.
`void` `neueKante​(Kante e)` Fuegt eine Kante dem Graphen hinzu.
`void` `neueKante​(Knoten start, Knoten ziel, double gewicht)` Fuegt eine Kante dem Graphen hinzu.
`void` `neuerKnoten​(Knoten k)` Fügt einen Knoten dem Graph hinzu.
`void` `setGerichtet​(boolean isGerichtet)` Legt fest, ob der Graph gerichtet oder ungerichtet ist.
`void` `setGewichtet​(boolean isGewichtet)` Legt fest, ob der Graph gewichtet oder ungewichtet ist.
`void` `setStatus​(List<String> status)` Stellt den Zustand des Graphen aus String-List wieder her
`String` `toCSVString​(boolean asMatrix)` Die Methode erstellt eine CSV-Ausgabe des Graphen entweder als Adjazenzliste oder als Adjazenzmatrix.
`String` `toString()` Textuelle Repraesentation des Graphen.

### Methods inherited from class java.lang.Object

`clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Constructor Detail

#### Graph

    public Graph​(boolean isGerichtet,
                 boolean isGewichtet)

Der Konstruktor erstellt einen neuen Graphen (genauer eine neue Adjazenzliste)

Parameters:
  `isGerichtet` - gibt an, ob es sich um einen gerichteten Graphen handelt
  `isGewichtet` - gibt an, ob die Kanten gewichtet sind.

#### Graph

    public Graph()

Der Konstruktor erstellt einen neuen ungerichteten, ungewichteten Graphen (genauer eine neue Adjazenzliste)

### Method Detail

#### loescheGraph

    public void loescheGraph()

Löscht alle Knoten und Kanten eines Graphen und stellt auf ungerichtet und ungewichtet zurück.

#### ladeGraph

    public boolean ladeGraph​(Table csvParser)

Ein Graph wird aus einer csv-Datei erstellt, die entweder eine Matrix oder eine Adjazenzliste enthält, die den Graph beschreibt.

Parameters:
  `csvParser` - Eine CSV-Datei als Table-Objekt
Returns:
  gibt zurück, ob das Laden erfolgreich war

#### setGewichtet

    public void setGewichtet​(boolean isGewichtet)

Legt fest, ob der Graph gewichtet oder ungewichtet ist.

Parameters:
  `isGewichtet` - neuer Wert

#### isGewichtet

    public boolean isGewichtet()

Gibt zurueck, ob der Graph gewichtet oder ungewichtet ist

Returns:
  gewichtet? (true/false)

#### setGerichtet

    public void setGerichtet​(boolean isGerichtet)

Legt fest, ob der Graph gerichtet oder ungerichtet ist.

Parameters:
  `isGerichtet` - neuer Wert

#### isGerichtet

    public boolean isGerichtet()

Gibt zurueck, ob der Graph gerichtet oder ungerichtet ist.

Returns:
  gerichtet? (true/false)

#### getNummer

    public int getNummer​(Knoten k)

Gibt die Nummer eines Knotens im Graphen zurück

Parameters:
  `k` - gesuchter Knoten
Returns:
  Nummer des Knotens (mit 0 beginnend)

#### getNummer

    public int getNummer​(Kante k)

Gibt die Nummer einer Kante zurück

Parameters:
  `k` - gesuchte Kante
Returns:
  Nummer der Kante (mit 0 beginnend)

#### getAdjazenzMatrix

    public double[][] getAdjazenzMatrix()

Die Methode getAdjazenzMatrix() gibt die Adjazenzmatrix zurueck.

Returns:
  double[][] Die AdjazenzMatrix als zweidimensionales Array

#### getAlleKanten

    public List<Kante> getAlleKanten​(Predicate<Kante>... filter)

Gibt eine Liste aller Kanten des Graphen zurück.

Parameters:
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Liste aller Kanten

#### entferneMarkierungBeiAllenKnoten

    public void entferneMarkierungBeiAllenKnoten()

Entfernt die Markierung bei allen Knoten des Graphen.

#### initialisiereAlleKnoten

    public void initialisiereAlleKnoten()

Initialisiert alle Knoten des Graphen.

#### initialisiereAlleKanten

    public void initialisiereAlleKanten()

Initialisiert alle Kanten des Graphen.

#### isKnotenEnthalten

    public boolean isKnotenEnthalten​(Knoten k)

Ueberprueft, ob ein Knoten in der Knotenliste enthalten ist. Sobald in der Knotenliste der Knoten k gefunden wird, wird true ausgegeben.

Parameters:
  `k` - Der gesuchte Knoten
Returns:
  true= ist enthalten, false = ist nicht enthalten

#### getAnzahlKnoten

    public int getAnzahlKnoten()

Gibt die Anzahl der Knoten im Graph zurueck

Returns:
  Anzahl der Knoten

#### getAlleKnoten

    public List<Knoten> getAlleKnoten​(Predicate<Knoten>... filter)

Gibt eine Liste aller Knoten des Graphen zurueck.

Parameters:
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Die Knotenliste. Falls leer wird eine leere Liste zurueckgegeben

#### getNachbarknoten

    public List<Knoten> getNachbarknoten​(Knoten k,
                                         Predicate<Knoten>... filter)

Gibt die Liste aller Nachbarknoten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist.

Parameters:
  `k` - Der Knoten, zu dem die Adjazenzliste gesucht wird
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Liste der Nachbarknoten

#### getAusgehendeKanten

    public List<Kante> getAusgehendeKanten​(Knoten k,
                                           Predicate<Kante>... filter)

Gibt eine Liste der ausgehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist. Bei ungerichteten Graphen wird nicht zwischen eingehenden und ausgehenden Kanten unterschieden.

Parameters:
  `k` - Der Knoten, zu dem die Kanten gesucht werden
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Liste der ausgehenden Kanten.

#### getAusgehendeKanten

    public List<Kante> getAusgehendeKanten​(int knotennr,
                                           Predicate<Kante>... filter)

Gibt eine Liste der ausgehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist. Bei ungerichteten Graphen wird nicht zwischen eingehenden und ausgehenden Kanten unterschieden.

Parameters:
  `knotennr` - Nummer des Knoten, zu dem die Kanten gesucht werden
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Liste der ausgehenden Kanten.

#### getEingehendeKanten

    public List<Kante> getEingehendeKanten​(int knotennr,
                                           Predicate<Kante>... filter)

Gibt eine Liste der eingehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist. Bei ungerichteten Graphen wird nicht zwischen eingehenden und ausgehenden Kanten unterschieden.

Parameters:
  `knotennr` - Die Nummer des Knotens, zu dem die Kanten gesucht werden
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Liste der eingehenden Kanten.

#### getEingehendeKanten

    public List<Kante> getEingehendeKanten​(Knoten k,
                                           Predicate<Kante>... filter)

Gibt eine Liste der eingehenden Kanten eines Knotens k zurueck, falls k in der Knotenliste vorhanden ist. Bei ungerichteten Graphen wird nicht zwischen eingehenden und ausgehenden Kanten unterschieden.

Parameters:
  `k` - Knoten, zu dem die Kanten gesucht werden
  `filter` - optionaler Filter, der auf die Liste angewendet wird. Er muss einen boolean-Wert zurückgeben: z.B. @literal{k->k.isMarkiert() && k.isBesucht()}
Returns:
  Liste der eingehenden Kanten.

#### getKnoten

    public Knoten getKnoten​(int knotennr)

Liefert einen Knoten des Graphen

Parameters:
  `knotennr` - Nummer der Knoten (beginnend mit 0)
Returns:
  liefert den Knoten mit dieser Nummer

#### neuerKnoten

    public void neuerKnoten​(Knoten k)

Fügt einen Knoten dem Graph hinzu.

Parameters:
  `k` - Der Knoten, der hinzugefuegt werden soll

#### entferneKnoten

    public void entferneKnoten​(int knotennr)

Entfernt einen Knoten aus dem Graphen

Parameters:
  `knotennr` - Nummer des Knotens, der geloescht werden soll

#### entferneKnoten

    public boolean entferneKnoten​(Knoten k)

Entfernt einen Knoten aus dem Graphen

Parameters:
  `k` - Knoten, der geloescht werden soll
Returns:
  gibt zurück, ob der Knoten erfolgreich entfernt wurde.

#### isKanteEnthalten

    public boolean isKanteEnthalten​(Kante e)

Ueberprueft, ob eine Kante im Graphen enthalten ist.

Parameters:
  `e` - Die zu suchende Kante
Returns:
  Kante enthalten (true) oder nicht (false)

#### isKanteEnthalten

    public boolean isKanteEnthalten​(int startNr,
                                    int zielNr)

Ueberprueft, ob eine Kante im Graphen enthalten ist. In ungerichteten Graphen wird nicht zwischen Start- und Zielknoten unterschieden

Parameters:
  `startNr` - Nummer des Startknotens
  `zielNr` - Nummer des Zielknotens
Returns:
  boolean Kante enthalten (true) oder nicht (false)

#### isKanteEnthalten

    public boolean isKanteEnthalten​(Knoten start,
                                    Knoten ziel)

Ueberprueft, ob eine Kante im Graphen enthalten ist. In ungerichteten Graphen wird nicht zwischen Start- und Zielknoten unterschieden

Parameters:
  `start` - Startknoten
  `ziel` - Zielknoten
Returns:
  boolean Kante enthalten (true) oder nicht (false)

#### getKante

    public Kante getKante​(Knoten start,
                          Knoten ziel)

Gibt eine gesuchte Kante aus dem Graphen zurueck. In ungerichteten Graphen wird nicht zwischen Start- und Zielknoten unterschieden

Parameters:
  `start` - Der StartKnoten
  `ziel` - Der StartKnoten
Returns:
  Die gesuchte Kante

#### getKante

    public Kante getKante​(int startnr,
                          int zielnr)

Gibt eine gesuchte Kante aus dem Graphen zurueck. In ungerichteten Graphen wird nicht zwischen Start- und Zielknoten unterschieden

Parameters:
  `startnr` - Der Nummer des StartKnoten
  `zielnr` - Die Nummer des Zielknoten
Returns:
  Die gesuchte Kante

#### neueKante

    public void neueKante​(Kante e)

Fuegt eine Kante dem Graphen hinzu. Dabei wird ueberprueft, ob die Kante schon im Graphen enthalten ist. Ist der Graph ungerichtet, werden sowohl "Hin-" und "RueckKante" erstellt.

Parameters:
  `e` - Die Kante, die hinzugefuegt werden soll

#### neueKante

    public void neueKante​(Knoten start,
                          Knoten ziel,
                          double gewicht)

Fuegt eine Kante dem Graphen hinzu. Dabei wird ueberprueft, ob die Kante schon im Graphen enthalten ist. Ist der Graph ungerichtet, werden sowohl "Hin-" und "RueckKante" erstellt.

Parameters:
  `start` - Der StartKnoten der Kante, die hinzugefuegt werden soll
  `ziel` - Der ZielKnoten der Kante, die hinzugefuegt werden soll
  `gewicht` - Das Gewicht der Kante, die hinzugefuegt werden soll

#### entferneKante

    public void entferneKante​(Kante e)

Entfernt eine Kante aus dem Graphen. Ist der Graph ungerichtet, werden sowohl "Hin-" und "RueckKante" entfernt.

Parameters:
  `e` - Die zu entfernende Kante

#### entferneKante

    public void entferneKante​(Knoten start,
                              Knoten ziel)

Entfernt eine Kante aus dem Graphen. Dabei wird ueberprueft, ob die Kante ueberhaupt im Graphen enthalten ist. Ist der Graph ungerichtet, werden sowohl "Hin-" und "RueckKante" entfernt.

Parameters:
  `start` - StartKnotens
  `ziel` - ZielKnotens

#### entferneKante

    public void entferneKante​(int startnr,
                              int zielnr)

Entfernt eine Kante aus dem Graphen. Ist der Graph ungerichtet, werden sowohl "Hin-" und "RueckKante" entfernt.

Parameters:
  `startnr` - Nummer des StartKnotens
  `zielnr` - Nummer des ZielKnotens

#### isLeer

    public boolean isLeer()

Ueberprueft, ob die Adjazenzliste leer ist, d.h. keine Knoten im Graphen enthalten sind.

Returns:
  true, wenn die Liste leer ist, sonst false

#### loescheAlles

    public void loescheAlles()

Loescht den gesamten Graphen

#### toCSVString

    public String toCSVString​(boolean asMatrix)

Die Methode erstellt eine CSV-Ausgabe des Graphen entweder als Adjazenzliste oder als Adjazenzmatrix.

Parameters:
  `asMatrix` - true, falls die CSV-Ausgabe eine AdjazenzMatrix sein soll, sonst false
Returns:
  CSV-Ausgabe

#### toString

    public String toString()

Textuelle Repraesentation des Graphen.

Overrides:
  `toString` in class `Object`
Returns:
  Der Graph als Stringrepraesentation

#### ausgabe

    public void ausgabe()

Konsolenausgabe der textuellen Repraesentation des Graphen.

#### getKnoteninfo

    public String getKnoteninfo​(Knoten k,
                                boolean zeigeWert)

Info über einen Knoten zurückgeben

Parameters:
  `k` - Knoten, des Info ermittelt werden soll
  `zeigeWert` - Soll der Wert des Knoten in der Info enthalten sein
Returns:
  Infotext oder Nummer des Knoten und ggf. sein Wert

#### getStatus

    public List<String> getStatus()

Speichert den Zustand des Graphen als String-List

Returns:
  List mit Zustand

#### setStatus

    public void setStatus​(List<String> status)

Stellt den Zustand des Graphen aus String-List wieder her

Parameters:
  `status` - List mit Zustand