Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Kompakter Zugriff auf Unter-Elemente einer Baumstruktur (https://www.delphipraxis.net/168100-kompakter-zugriff-auf-unter-elemente-einer-baumstruktur.html)

Daniel 4. Mai 2012 18:04

Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Schönen guten Tag - ich hätte da gern ein Problem ... :stupid:

Es geht um den Zugriff auf Elemente einer selbstgebauten Baumstruktur. Folgendes Beispiel:
Code:
Node1
  + Node2
      + Node3
          + Node 3.1
          + Node 3.2
          + Node 3.3
          + Node 3.4
          + Node 3.5
Ziel ist es, die Unterknoten 3.1 bis 3.5 in eine Liste oder ein Array zu bekommen. Ich kenne den Aufbau des Baumes, kann also den kompletten Pfad über die Nodes 1, 2 und 3 angeben. Aber wie mache ich das mit der gringst-möglichen Schreibarbeit?
:gruebel:

Ich könnte mich natürlich Ebene für Ebene durchhangeln - aber da tippe ich mir ja 'nen Wolf. Oder man könnte so etwas wie ein
Delphi-Quellcode:
mytree.find_node_by_name('Node3')
implementieren, aber eine Suche wollte ich gerade vermeiden, da ich ja weiß, wo der Knoten ist und zu Gunsten der Performance möchte dieses Wissen da auch irgendwie reinstecken.

Nun bin ich über "Fluent Interfaces" gestolpert. Und die Notation kommt dem, was ich will, schon halbwegs nahe:
Delphi-Quellcode:
mytree.get('Node1').get('Node2').get('Node3')
. Aber nur für einen Zugriff da jetzt das komplette Interface-Geraffel reinbasteln - das erscheint mir ein wenig überdimensioniert. Im Moment gebe ich dem Baum ein dynamisches Array - aber als schön empfinde ich das eigentlich auch nicht:
Delphi-Quellcode:
mytree.get( ['Node1', 'Node2', 'Node3'] );
Parallel dazu habe ich dann noch
Delphi-Quellcode:
mytree.get( 'Node1.Node2.Node3' )
und fuddel mir den erhaltenen String dann auseinander, um den Weg durch den Baum zu finden. (In meinem Fall kann ich ausschließen, dass die Knoten im Namen einen Punkt enthalten.) Aber irgendwie ist das doch alles holperig ... irgendwie fuddelig eben.
Welche Alternativen könnte es denn da noch geben? Ich würde gern mit möglichst einer Anweisung an die gewünschten Unterknoten kommen.


... ach ja - eine klitzekleine Randbedingung gibt es noch: Es könnte sein, dass es den Knoten und seine Unterknoten auch mal gar nicht gibt. In diesem Fall müsste ich ein leeres Array oder eine leere Liste als Resultat dieser Operation zurück erhalten. Aus diesem Grund scheint mir die Verkettung irgendwelcher Node-Objekte nicht (so richtig) in Frage zu kommen...

haentschman 4. Mai 2012 18:38

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Hallo Daniel...

wo kommen denn die Nodes her ? Liegt da eine "Datenmenge" zugrunde oder sind die nur so angelegt ?

:hi:

r2c2 4. Mai 2012 19:36

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Hallo Daniel,

du hast ne interessante Frage hier. Und um ehrlich zu sein, denke ich, hast du ne schöne Lösung auch schon gefunden. Ich finde
Delphi-Quellcode:
mytree.get( 'Node1.Node2.Node3' )
nämlich gar nicht schlecht. Effektiv bist du nämlich natürlich nicht der einzige, der so ne Anforderung hat. Bei XML hat man nämlich z.B. auch so Situationen. Und da gibt es ja XPath, was letztendlich nichts anderes ist ein deine Idee um ein paar ganz viele Features aufgemotzt. Und das mit dem '.' (bzw. '/' bei XPath) im Namen ist auch leicht lösbar. Wenn du ein bisschen auf die Syntax aufpasst (guck dir vielelicht wirklich mal XPath an), kannst du das in Zukunft bei Bedarf leicht erweitern.

Ne weitere Lösung, die du dir bei XML abgucken kannst, wären Variants einzusetzen. Hab ich bisher noch nie selbst verwendet, aber das sollte auch ne praktikable Lösung sein.

mfg

Christian

Gustav.R 4. Mai 2012 20:39

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Du weisst, wo der Knoten ist?

Der Knoten könnte aber eventuell nicht initialisiert sein?

Schön zu wissen, was Du so alles weisst!

Könntest Du Dein Problem denn nicht bitte noch etwas unschärfer formulieren?

GG

Bea fügt hinzu:
Und weshalb ist dieser Typ, der offensichtlich die Weltherrschaft anstrebt, zu dumm um seine Fragen in einem Zweitaccount zu stellen?

Daniel 4. Mai 2012 23:26

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Zitat:

Zitat von Gustav.R (Beitrag 1164943)
Du weisst, wo der Knoten ist?

Der Knoten könnte aber eventuell nicht initialisiert sein?

Könntest Du Dein Problem denn nicht bitte noch etwas unschärfer formulieren?

Was soll ich sagen? Beide Aussagen sind korrekt. Wenn ich Informationen haben möchte, dann weiss ich meist, wo sie stecken. Und ja, manchmal kann es passieren, dass die Stelle leer ist und und die Daten nicht vorhanden sind. Auch das ist in dem System ein gültiger Zustand.

Aber da die Pfade je nach Anforderung unterschiedlich sein werden, lässt sich mein Anliegen nicht viel konkreter formulieren. Wäre es immer der gleiche Pfad, kämen wieder andere Lösungen in Betracht.

@Christian: XPath ist ein gutes Stichwort, da werde ich einen Blick riskieren. :-)

mani64 5. Mai 2012 00:39

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Hallo Daniel

wie ist denn dein Baum-Objekt aufgebaut?

Etwa so: Jedes Element hat 2 Verkettungen: eine zum nächsten Element auf der gleichen Ebene und eine zu dem ersten "Kind" (nächstuntere Ebene)?

Die Aufgabe ist ja ganz klar: "Suche alle Unterknotenpunkte einer Ebene und liste sie auf", wie du das realisieren kannst, ist aber von deinem Baum-Objekt abhängig.
Wie wäre es, wenn du uns den Code deines Baumes mal präsentierst, dann kann man auch mehr zur Lösung sagen.

Daniel 5. Mai 2012 13:12

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur
 
Moin,


ich erstelle die Baum-Objekte (Knoten) auf Basis einer strukturierten Textdatei. Jeder Koten wird durch eine Instanz einer "Node"-Klasse repräsentiert. Die Klasse ist von TObject abgeleitet und hat 'ne Eigenschaft "Parent" und eine Eigenschaft "Children". Damit sind die Knoten gewissermaßen "vertikal" miteinander verbunden. Daneben gibt es noch Eigenschaften für die Nutzdaten, die aber für die Baumstruktur irrelevant sind. Meine Baum-Klasse ist ein Mini-Objekt, welches primär nur eine Eigenschaft "Root" enthält.


Ich habe mich eben in XPath eingelesen (vielen Dank für das Stichwort) und das scheint genau das zu sein, was ich benötige. Ich denke, dass ich die Zugriffe damit recht zielgerichtet werde vornehmen können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz