package graph; import java.util.List; import java.util.Arrays; /** * Die Klasse Kante beschreibt die Datenstruktur einer Kante, bestehend aus Startknoten, Gewicht und Zielknoten. * Da Kanten innerhalb von Adjazenzlisten und -Matrizen repraesentiert werden, ist diese Klasse eigentlich unnoetig! * Sie wurde zum Zweck der Vereinfachung - sozusagen als Zwischenspeicher von Kanten - eingefuehrt. * Auch soll sie das Kantengewicht verwalten und Aufschluss darueber geben, ob sie gefaerbt/geloescht ist oder nicht. * * @author Dirk Zechnall, Thomas Schaller * @version 22.07.2020 (v6.4) */ public class Kante extends GraphElement { private Knoten start; private Knoten ziel; private double gewicht; private boolean markiert = false; private boolean geloescht = false; private int farbe = -1; /** * Der Konstruktor erstellt eine neue Kante mit Start- und Zielknoten und Kantengewicht. * Die Kante ist zu Beginn ungefaerbt. * * @param neuerStart Der neue Startknoten * @param neuerZiel Der neue Zielknoten * @param neuesGewicht Das neue Kantengewicht */ public Kante (Knoten neuerStart, Knoten neuerZiel, double neuesGewicht) { gewicht = neuesGewicht; start = neuerStart; ziel = neuerZiel; } /** * Die Methode init initialisiert die Kantenfaerbung (auf unmarkiert) */ protected void init() { markiert = false; geloescht = false; } /** * Setzt den Status einer Kante, der in einem String gespeichert ist. * Form: markiert,geloescht,farbe * Dabei sind markiert und geloescht boolsche Werte (0 = false, 1 = true) und * die farbe eine Zahl * @param status Statusstring */ public void setStatus(String status) { List items = Arrays.asList(status.split("\\s*,\\s*")); this.markiert = items.get(0).equals("1"); this.geloescht = items.get(1).equals("1"); this.farbe = Integer.parseInt(items.get(2)); } /** * Liefert den Status einer Kante als String. * Form: markiert,geloescht,farbe * Dabei sind markiert und geloescht boolsche Werte (0 = false, 1 = true) und * die farbe eine Zahl * @return Statusstring */ public String getStatus() { return ""+(markiert ? "1," : "0,")+ (geloescht ? "1," : "0,")+ farbe; } /** * Setzt das Gewicht der Kante * * @param neuesGewicht Das neu zu setzende Gewicht */ public void setGewicht(double neuesGewicht) { gewicht = neuesGewicht; } /** * Gibt das Gewicht der Kante zurueck * * @return Gewicht der Kante */ public double getGewicht() { return gewicht; } /** * Setzt den Startknoten der Kante * * @param neuerSatrtKnoten Der neu zu setzende Startknoten */ public void setStart(Knoten neuerSatrtKnoten) { start = neuerSatrtKnoten; } /** * Gibt den Startknoten der Kante zurueck * * @return Startknoten */ public Knoten getStart() { return start; } /** * Setzt den Zielknoten der Kante * * @param neuerZielKnoten Der neu zu setzende Zielknoten */ public void setZiel(Knoten neuerZielKnoten) { ziel = neuerZielKnoten; } /** * Gibt den Zielknoten der Kante zurueck * * @return Zielknoten */ public Knoten getZiel() { return ziel; } /** * Gibt Knoten am anderen Ende der Kante zurueck * @param k Knoten am ersten Ende der Kante * @return Knoten am anderen Ende */ public Knoten getAnderesEnde(Knoten k) { if (k == start) return ziel; if (k == ziel) return start; return null; } /** * Setzt das markiert-Attribut der Kante * * @param wert Der neu zu setzende markiert-Wert */ public void setMarkiert(boolean wert) { markiert = wert; } /** * Gibt zurück, ob die Kanten markiert ist * * @return markiert? */ public boolean isMarkiert() { return markiert; } /** * Setzt das gelöscht-Attribut der Kante * * @param wert Der neu zu setzende gelöscht-Wert */ public void setGeloescht(boolean wert) { geloescht = wert; } /** * Gibt den gelöscht-Wert der Kante zurueck * * @return gelöscht? */ public boolean isGeloescht() { return geloescht; } /** * Gibt zurueck, in welcher Farbe die Kante gezeichnet werden soll. * Ist die Farbe nicht gesetzt, dann wird eine unmarkierte Kante in Farbe 1 * und eine markierte in Farbe 2 gezeichnet. * @return Nummer der Farbe */ public int getFarbe() { if(farbe == -1) { if(geloescht) return 2; if(markiert) return 1; return 0; } return farbe; } /** * Setzt die Farbe auf einen bestimmten Farbindex * @param farbe Index der Farbe (0-19) */ public void setFarbe(int farbe) { if(farbe>=0 && farbe < 20) this.farbe = farbe; } /** * Setzt die Farbe auf die Standardfarbgebung zurück */ public void setStandardFarbe() { farbe = -1; } /** Vergleicht die Kante mit einer anderen Kante bezüglich ihres Gewichts * @param e andere Kante * @return kleiner 0 die andere Kante hat ein größeres Gewicht, größer 0 die andere Kante hat ein kleineres Gewicht, gleich 0 beides sind gleich */ public int compareTo(GraphElement e) { double w1, w2; if(e instanceof Knoten) w1 = ((Knoten) e).getDoubleWert(); else w1 = ((Kante) e).getGewicht(); w2 = getGewicht(); return (int) (w2-w1); } /** * Die Methode ueberschreibt die Methode toString() und gibt die String-Raepraesentation einer Kante zurueck * * @return String-Raepraesentation der Kante */ @Override public String toString() { return " --("+gewicht+")--> "; } }