Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger
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!
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!
//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.