Tiefe Kopie einer Baumstruktur als statische Methode

Status
Nicht offen für weitere Antworten.

SamHotte

Top Contributor
Moin,
ich habe eine sehr umfangreiche Baumstruktur und brauche relativ oft kleine Ausschnitte daraus. Der Baum selbst ist als Singleton realisiert, da die Änderungen in eine Datenbank geschrieben werden bzw. von dort gelesen wird.
Für die Ausschnitte habe ich momentan eine separate Klasse, die aus dem Singleton-Baum eine spezielle Instanz erzeugt. Das finde ich nicht wirklich praktisch, da ich im Programm recht oft mal das eine und mal das andere benötige.
Um den Stil zu verbessern (und einige Konstruktoren einzusparen), wollte ich meine konstruktorenbasierte Kopiererei durch eine schön benamste statische Methode abwickeln lassen. Da der Baum allerdings rekursiv zusammengesetzt wird, brauche ich ständig Methodenaufrufe - und da wird angemeckert, dass ich von einem statischen Kontext keine non-static Methode aufrufen kann. Zu einem drastischen Ende des "verstatischen" meiner bisherigen Ergüsse kommt es nun, wenn ich eine Instanzmethode der Superklasse aufrufen muss :bahnhof:
Gibt's da irgendeinen Trick? Die Methoden der Superklasse fügen Elemente in eine Map ein, sodass ich dort ja wohl um eine Instantiierung nicht herumkomme, oder?
[schild=1]Ideen gesucht[/schild]
 
Warum realisierst du deine "Ausschnitte" nicht als ein TreeModel, dass auf das Singleton-TreeModel zugreift und einfach nur nen anderen Root-Knoten hat?
 
Mach ich im Prinzip ja. Die Ausschnitte sind Bäume, die aus den vom Originalbaum ausgewählten Blättern bestehen (plus die jeweiligen Pfade zur Wurzel). Da ich nur die Blätter in der Datenbank speichere, muss ich die Ausschnitte immer wieder unterschiedlich zusammensetzen, also jeweils einen "neuen" Baum kreieren, und dazu brauche ich so grundsätzliche Funktionalität wie "Knoten unter Vater einfügen" ...
 
Ja, aber die brauchste doch nur einmal implementieren und auch nicht statisch. Du kannst insert/move/...-Operationen im Singleton-TreeModel implementieren und in den Ausschnitt-Model reichst du einfach nur an die Methoden des Singleton weiter. Über die entsprechenden von dir implementierten Listener erfahren die abgeleiteten Model dann auch von Änderungen und aktualisieren sich.
 
Hm, kapier ich nicht ganz - im Singleton-Modell stoße ich bei insert/move/delete die jeweiligen Datenbankoperationen an, was ich im Ausschnittsfall nicht möchte. Also kann ich ja nicht weiterleiten.
Das mit dem Verweisen auf das originale Modell kann ich mir auch nicht so recht vorstellen, da handle ich mir doch die Original-Kinder der Knoten ein (und genau das will ich beim Ausschnitt nicht).
 
vergiss einfach das Singleton und den ganzen static Zeugs?

Warum nicht gute alte Instanzen, bei richtiger Programmierung passiert da auch nix schlimmes wenn du die Erzeugung neuer Bäume genau kontrollierst!

Und: wie hast du denn deinen Baum implementiert?

vergiss mal das TreeModel und denk drüber nach
Code:
class Node {
    Node parent; 
        // eh klar, nur die Wurzel hat hier null
    "Liste von Nodes" children; 
        // eigentlich redundant aber praktisch
    .. 
}
d.h. ein Baum ist einfach ein Knoten mit Kindern, und wenn du einen "Ausschnitt" willst, dann nimmst du einfach den entsprechenden Knoten, man braucht dazu überhaupt nix zu programmieren?
 
Singleton oder nicht ist wurscht, das stimmt schon. Ich hab's halt so gebaut, wäre anders auch denkbar. Ist aber nicht Kern des Problems.

Ich hab für meinen Baum TreeModel implementiert und sammle die Knoten in einer TreeMap. Ich brauche im Knoten noch ein bisschen mehr Info, da es in meinem Baum auf die Reihenfolge der Kinder ankommt. Aber auch das klappt.

Jetzt zum Problem: ich habe eine Liste anderer Objekte, die mit einzelnen Knoten verknüpft sind; dabei kann ich sowohl Blätter als auch "echte" Knoten wählen. Wenn ich nun in der Liste ein Element auswähle, möchte ich in meinem Panel daneben einen Baum sehen, der nur aus den ausgewählten Knoten besteht. Die im Originalbaum vorhandenen Kinder sollen quasi "weggefiltert" werden.
Das realisiere ich eben über neue Bäume, die auf Basis des Originals erstellt werden (nur dort bekomme ich den Pfad zur Wurzel).
 
Besten Dank, den Ansatz über Filter werde ich mal ausprobieren! Schade, dass man sowas in keinem herkömmlichen Buch findet ... 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben