AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

Ein Thema von Daniel · begonnen am 4. Mai 2012 · letzter Beitrag vom 5. Mai 2012
Antwort Antwort
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#1

Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 4. Mai 2012, 19:04
Schönen guten Tag - ich hätte da gern ein Problem ...

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?


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 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: 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: mytree.get( ['Node1', 'Node2', 'Node3'] ); Parallel dazu habe ich dann noch 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...
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.275 Beiträge
 
Delphi 12 Athens
 
#2

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 4. Mai 2012, 19:38
Hallo Daniel...

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

  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#3

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 4. Mai 2012, 20:36
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 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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Gustav.R
(Gast)

n/a Beiträge
 
#4

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 4. Mai 2012, 21:39
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?

Geändert von Gustav.R ( 4. Mai 2012 um 21:57 Uhr) Grund: Den Chef der DP zu spät erkannt ;-)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 5. Mai 2012, 00:26
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
mani64

Registriert seit: 8. Apr 2009
49 Beiträge
 
Delphi 5 Professional
 
#6

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 5. Mai 2012, 01:39
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.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Kompakter Zugriff auf Unter-Elemente einer Baumstruktur

  Alt 5. Mai 2012, 14:12
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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