Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger

Hallo liebes Forum,

mein Java ist mitlerweile etwas in die Jahre gekommen und ich weiß nicht genau wie ich bei meinem Aktuellen Projekt vorgehen soll.

Problem:
Ich habe einen gerichteten Graphen und möchte von diesem ausgehend zwischen zwei "Punkten" den kürzesten Weg finden.
Bsp.: (Adjazenzmatrix) Im Angang.

Das ganze sollte einfach in der Wartung sein deswegen dachte ich man erstellt sozusagen die "Versionen" und ordnet ihnen dann nachfolger zu. Darüber sollte ich schon mit irgendeinem Algorithmus den kürzesten Weg finden.

Java:
//import java.util.PriorityQueue;
import java.util.Arrays;
//import java.util.List;
//import java.util.ArrayList;
//import java.util.Collections;
 
class Version {
    public final String name;
    public Edge[] verbindungen;
    public Version(String argName) {
        name = argName;
    }
    public String toString() {
        return name;
    }
}
 
 
class Edge {
    public final Version target;
    public Edge(Version argTarget) {
        target = argTarget;
    }
}
 
public class shortPath {
 
    public static void main(String[] args) {
        //---------------------------------------------
        //erstelle die noetigen Versionen
        Version VA1 = new Version("VA1");
        Version VA2 = new Version("VA2");
        Version VB1 = new Version("VB1");
        Version VB2 = new Version("VB2");
        Version VB3 = new Version("VB3");
 
        //setzte alle Versionen die erreichbar sind
        VA1.verbindungen = new Edge[]{ new Edge(VA2) };
        VA2.verbindungen = new Edge[]{ new Edge(VB1) };
        VA2.verbindungen = new Edge[]{ new Edge(VB3) };
        VB1.verbindungen = new Edge[]{ new Edge(VB2) };
        VB1.verbindungen = new Edge[]{ new Edge(VB3) };
        VB2.verbindungen = new Edge[]{ new Edge(VB2) };
        //--------------------------------------------
        System.out.println(Arrays.toString(VA1.verbindungen));
        for(Edge Edge: VA2.verbindungen) {
            System.out.println(Edge.toString());
        }
    }
}

Sollten bei meinem letzten print in der Main jetzt nicht:
VB1
VB3
rauskommen?
(das wird ausgegeben:
[Edge@1befab0]
Edge@13c5982)

Wäre sehr net wenn mir jm auf die Sprünge helfen könnte!

Grüße,
Max
 

Anhänge

  • tmp.PNG
    tmp.PNG
    14,1 KB · Aufrufe: 19
Sollten bei meinem letzten print in der Main jetzt nicht:
VB1
VB3
rauskommen?
(das wird ausgegeben:
[Edge@1befab0]
Edge@13c5982)

Es wird die "toString()" Methode von der Klasse Edge ausgeführt (so wie es im Code steht). Diese wurde anscheinend nicht überschrieben.

Du hast noch einen Fehler in deiner Implementierung: du erstellst ein Object VA2, dieses Objekt hat ein Attribut "verbindungen", welchem du 2x etwas zuweist. Bei der 2.Zuweisung gehen die Daten der 1.Zuweisung verloren!
 
Wie kann ich es machen dass es nicht überschireben wird?

Eine Möglichkeit wäre folgende:
Java:
        //setzte alle Versionen die erreichbar sind
        VA1.verbindungen = new Edge[]{ new Edge(VA2) };
        VA2.verbindungen = new Edge[]{ new Edge(VB1), new Edge(VB3) };
        VB1.verbindungen = new Edge[]{ new Edge(VB2), new Edge(VB3) };
        VB2.verbindungen = new Edge[]{ new Edge(VB2) };]/code]

Aber generell ist das Design der beiden Klasse "Edge" und "Version" etwas hinderlich. Mache die Attribute private und verwende setter/getter Methoden (direkter Zugriff auf Attribute bereitet mehr Probleme als das er hilft).
Wenn du nicht weißt wieviele Verbindungen eine Version haben wird solltest du einer List (ArrayList zum Beispiel) arbeiten statt mit einem Array.
 
Wie kann ich es machen dass es nicht überschireben wird? 🙂
Vielen Dank schonmal!
Die toString() Methode musst du selber überschreiben.

Bei mir in der IDE drücke ich STRG+O, dann wird mir angezeigt was ich alles überschreiben könnte.
Java:
    @Override
    public String toString() {
        return super.toString();
    }
Das super.toString() musst du durch die Ausgabe, die du gerne hättest, ersetzen.
 
setVerbindungen erwartet ein Array, wieso funktioniert bei mir:
String[] tmp = {"VA2"};
VA1.setVerbindungen(tmp);


Aber:
VA1.setVerbindungen({"VA2"});

liefert:
Syntax error.
{"VA2"} ist doch eigentlich auch ein Array, nur ein sehr kurzes 😀
 

Zurück
Oben