AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Baumstruktur aus Liste erzeugen

Ein Thema von fillibuster · begonnen am 1. Dez 2014 · letzter Beitrag vom 13. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#1

Baumstruktur aus Liste erzeugen

  Alt 1. Dez 2014, 15:09
Hallo,

ich versuche gerade eine Baumstruktur (Treeview) aus einer Liste zu erzeugen. Diese hat folgendes Format:

1;Beschreibung 1
1;Beschreibung 2
2;Beschreibung 3
2;Beschreibung 4
3;Beschreibung 5
1;Beschreibung 6
2;Beschreibung 7

Das einlesen und erzeugen von Knoten ist kein Problem, aber ich weiß nicht, wie ich die Struktur erzeugen kann. Sollte so aussehen:

Code:
Beschreibung 1
Beschreibung 2
  |- Beschreibung 3
  |- Beschreibung 4
         |- Beschreibung 5
Beschreibung 6
  |- Beschreibung 7
Hat jemand einen Tipp für mich? Danke!
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Baumstruktur aus Liste erzeugen

  Alt 1. Dez 2014, 15:40
So richtig hab ich deine Frage nicht verstanden, du kannst die Liste einlesen und du kannst Knoten erzeugen wie in diesem Codebeispiel. Was fehlt denn jetzt noch genau?

EDIT: Achso für C# natürlich dann z.B. hier
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina ( 1. Dez 2014 um 15:49 Uhr)
  Mit Zitat antworten Zitat
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Baumstruktur aus Liste erzeugen

  Alt 1. Dez 2014, 15:50
Hi,

ich habe ein Problem die Baumstruktur zu erzeugen. Die Nodes sollen ja nicht alle einfach auf die oberste Ebene gepackt werden!

Viele Grüße ...
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#4

AW: Baumstruktur aus Liste erzeugen

  Alt 1. Dez 2014, 15:55
Hier ein Stück Pseudocode das das ganze Lösen sollte:
Code:
var recentNode = root(); // depth = 0
for ([depth, element] in list)
  parentNode = recentNode
  while (parentNode.depth >= depth)
    parentNode = parentNode.parent
  parentNode.addChild(element)
  recentNode = element
(ungetestet, erwartet gültige Tiefenangaben)

[add]Erklärung: Der Code merkt sich den zuletzt hinzugefügten Knoten. Dann hangelt er sich den Baum hoch, bis die richtige Tiefe erreicht ist, und fügt dann das nächste Kind ein.
Mike
Passion is no replacement for reason

Geändert von JasonDX ( 1. Dez 2014 um 15:59 Uhr)
  Mit Zitat antworten Zitat
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Baumstruktur aus Liste erzeugen

  Alt 1. Dez 2014, 17:04
Hallo,

danke werde ich mal in Ruhe testen

Viele Grüße ...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Baumstruktur aus Liste erzeugen

  Alt 1. Dez 2014, 17:53
Grundsätzlich gesehen ist diese Art der Liste für einen Baum relativ wackelig.

Besser wäre es eine Liste mit einem Index und ParentIndex zu verwenden
idxpidxDescription
10Beschreibung 1
20Beschreibung 2
32Beschreibung 3
42Beschreibung 4
54Beschreibung 5
60Beschreibung 6
76Beschreibung 7
Dabei sind in diesem Beispiel die Root-Elemente, die mit pidx=0.

Nun ist es völlig egal, in welcher Reihenfolge diese Daten vorliegen, der Baum kann immer korrekt erstellt werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Baumstruktur aus Liste erzeugen

  Alt 13. Jan 2015, 15:17
Hallo,

@Sir Rufo: mach ich immer so, wenn eine Datenbank im Programm vorhanden ist - find ich auch einfacher!

Jetzt habe ich aber dazu noch eine Frage. Weiß jemand, wie ich diese Struktur am einfachsten nach JSON bekomme? Also komplett ohne Treeview (Baumstruktur soll aber in JSON enthalten sein). Json.net habe ich jetzt erstmal installiert und eine Klasse für die Einträge erstellt:

Code:
    public class navigationItem
    {
        public string key { get; set; }
        public string title { get; set; }
        public string meta { get; set; }
        public string icon { get; set; }
        public string tooltip { get; set; }
        public string document { get; set; }
        public string mime { get; set; }
        public string filetype { get; set; }
        public List<navigationItem> children { get; set; }
    }
Jetzt sitze ich an einer rekursiven Funktion und brauch nen Denkanstoss (configList ist die eingelesene Liste):
Code:
   private string createTree(List<string> configList, List<navigationItem> navigationList)
   {   
       return JsonConvert.SerializeObject(navigationList);
   }
Danke

Geändert von fillibuster (13. Jan 2015 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#8

AW: Baumstruktur aus Liste erzeugen

  Alt 13. Jan 2015, 15:51
Also erstmal die Baumstruktur:

Code:
// create test data
   var list = new [] {
      new Node() { Id=1, Description="Beschreibung 1", ParentId = 0 },
      new Node() { Id=2, Description="Beschreibung 2", ParentId = 0 },
      new Node() { Id=3, Description="Beschreibung 3", ParentId = 2 },
      new Node() { Id=4, Description="Beschreibung 4", ParentId = 2 },
      new Node() { Id=5, Description="Beschreibung 5", ParentId = 4 },
      new Node() { Id=6, Description="Beschreibung 6", ParentId = 0 },
      new Node() { Id=7, Description="Beschreibung 7", ParentId = 6 },   
   };
   
   // make a lookup to quickly build the structure -> O(n)
   var lookup = list.ToLookup(node => node.ParentId);
   
   // hook up the nodes (also O(n))
   var tree = new List<Node>();   
   foreach (var node in list)
   {
      // if root node, add to tree
      if (node.ParentId == 0)
         tree.Add(node);

      // hook in all children
      node.Children = lookup[node.Id].ToList();
   }
Was das serialisieren nach Json angeht, schau Dir am besten mal Newtonsoft.Json an: https://www.nuget.org/packages/Newtonsoft.Json/
Das ist *das* Library in .NET wenn es um Json geht. Selbst Microsoft setzt in vielen Teilen seiner Web-Libraries inzwischen darauf.

Das ist dann ein Einzeiler:
Code:
string jsonString = JsonConvert.SerializeObject(tree);
Der JsonString sieht dann so aus:
Code:
[
   {"Id":1,"ParentId":0,"Description":"Beschreibung 1","Children":[]},
   {"Id":2,"ParentId":0,"Description":"Beschreibung 2","Children":
      [
         {"Id":3,"ParentId":2,"Description":"Beschreibung 3","Children":[]},
         {"Id":4,"ParentId":2,"Description":"Beschreibung 4","Children":
            [
               {"Id":5,"ParentId":4,"Description":"Beschreibung 5","Children":[]}
            ]
         }
      ]
   },
   {"Id":6,"ParentId":0,"Description":"Beschreibung 6","Children":
      [
         {"Id":7,"ParentId":6,"Description":"Beschreibung 7","Children":[]}
      ]
   }
]
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Baumstruktur aus Liste erzeugen

  Alt 13. Jan 2015, 15:56
Hi Phoenix,

wow fett, vielen Dank dafür . Der Punkt, an dem ich gerade stocke ist, dass die ID's in der Ausgangsliste nicht eindeutig sind - sie geben sozusagen nur die Tiefe vor. Die Reihenfolge aber schon!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#10

AW: Baumstruktur aus Liste erzeugen

  Alt 13. Jan 2015, 16:01
Inwiefern sind die ID's nicht eindeutig?

Wenn die Reihenfolge passt, dann nimm doch einfach ne klassische Zählerschleife über (i = 0; i < list.Count; i++) und benutz den index als ID.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Alt 13. Jan 2015, 16:11     Erstellt von fillibuster
Dieser Beitrag wurde von Phoenix gelöscht. - Grund: Doppelpost
Antwort Antwort
Seite 1 von 2  1 2      


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 12:58 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