Laden...

[gelöst] Wie Baumstruktur aus Liste mit Pfaden erzeugen?

Erstellt von xbredoillex vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.106 Views
X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren
[gelöst] Wie Baumstruktur aus Liste mit Pfaden erzeugen?

Hallo,

es will mir nicht gelingen, aus einer Liste mit Pfadangaben eine Baumstruktur zu erzeugen.

Das Thema wurde hier und an anderer Stelle schon oft besprochen, jedoch immer im Bezug auf TreeNodes, während ich das Ganze über verschachtelte Klassen lösen muss.

Mein Ansatz sieht bisher so aus:

Die Pfade befinden sich in einer String-Liste, z.B.


public List<string> pfadliste = new List<string> {	"Tiere/Weichtiere/Kopffuessler/Krake",
													"Tiere/Weichtiere/Schnecken",
													"Tiere/Wirbeltiere/Amphibien/Frosch",
													"Tiere/Wirbeltiere/Amphibien/Schwanzlurche",
													"Tiere/Wirbeltiere/Fische",
													"Tiere/Wirbeltiere/Reptilien/Schlange",
													"Tiere/Wirbeltiere/Saugetiere/Nager/Hamster/Zwerghamster",
													"Tiere/Wirbeltiere/Saugetiere/Primaten/Menschenaffen/Gorilla",
													"Tiere/Wirbeltiere/Saugetiere/Primaten/Menschenaffen/Mensch",
													"Tiere/Wirbeltiere/Voegel" };

Jedes Element aus einem Teilpfad soll von einem Objekt der Klasse BaumElement dargestellt werden:


	public class BaumElement
	{
		public BaumElement()
		{
		}
		
		public BaumElement(string name, BaumElement parent)
		{
			Name = name;
			Parent = parent;
		}
		
		private List<BaumElement> _children = new List<BaumElement>{}; 
		
		public string Name {get; set;}
		
		public BaumElement Parent {get; set;}
		
		public List<BaumElement> Children
		{
			get {return _children;}
			set {_children = value;}
		}
		
		public BaumElement FuegeNeuesUnterelementEin(string name, BaumElement parent)
		{
			BaumElement neuesElement = new BaumElement(name, parent);
			Children.Add(neuesElement);
			return neuesElement;
		}
	}

Und zuletzt noch die Funktion ErzeugeBaum, die das befüllte Wurzel-BaumElement-Objekt zurückgeben soll:


public BaumElement ErzeugeBaum(List<string> pfadliste)
{
	BaumElement rootElement = new BaumElement();
	foreach(string pfad in pfadliste)
	{
		string[] teilPfadArray = pfad.Split('/');
		for (int i=0; i<teilPfadArray.Length; i++) {
			string teilpfad = teilPfadArray[i];
			//
			//Bis hierher funktioniert es, aber dann verließen sie ihn...
			//TODO: Erzeuge mit BaumElementen (über Name, Parent, Children) 
			//die verschachtelte Baumstruktur (Funktion? Rekursiv?).
			//
		}
	}
	return rootElement;
}

Die Funktion erzeugt für jeden Pfad der Liste ein Teilpfadarray, in dem die einzelnen Namen der zu erzeugenden BaumElemente abgelegt sind. Die Reihenfolge der Namen enspricht der Beziehung Wurzel>KindvonWurzel>Kindvon(KindvonWurzel)>etc. wobei ich eben nach vielen Versuchen nicht in der Lage bin, das mit einer Funktion zu beschreiben um die Elemente entsprechend zu erzeugen.

Hat jemand einen Tipp für mich?

Vielen Dank im voraus!
Gruß
xbredoillex

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo xbredoillex,

jedoch immer im Bezug auf TreeNodes, während ich das Ganze über verschachtelte Klassen lösen muss.

das macht doch keinen Unterschied.

herbivore

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Hallo herbifore,

das macht doch keinen Unterschied.

Tja, Hüstel, was soll ich sagen?

Nochmals nachgelesen, Gehirn eingeschaltet und nach minimalen Anpassungen deiner Lösung aus dem Beitrag TreeView abhängig vom Verzeichnislevel füllen hat es auch schon funktioniert. 😃

Falls es jemanden interessiert, hier die Lösung:

Die Klasse BaumElement (leicht abgeändert)


	public class BaumElement
	{
		public BaumElement()
		{
		}
		
		public BaumElement(string name)
		{
			Name = name;
		}
		
		private List<BaumElement> _children = new List<BaumElement>{}; 
		
		public string Name {get; set;}
		
		public BaumElement Parent {get; set;}
		
		public List<BaumElement> Children
		{
			get {return _children;}
			set {_children = value;}
		}
		
		public BaumElement FuegeNeuesUnterelementEin(BaumElement neuesElement)
		{
			neuesElement.Parent = this;
			Children.Add(neuesElement);
			return neuesElement;
		}
	}


Die Funktion zum Füllen des Baumes:


	public BaumElement ErzeugeBaum(List<string> pfadliste)
	{
		Dictionary <String, BaumElement> dictElement = new Dictionary <String, BaumElement> ();
		BaumElement gefuelltesBaumElement = new BaumElement("Wurzel");
		BaumElement wurzelElement = null;
		foreach (string pfad in pfadliste)
		{
			string[] teilPfadArray = pfad.Split('/');
			string teilPfad = String.Empty;
			
			for(int i=0; i<teilPfadArray.Length; i++) {
				
				string teilStr = teilPfadArray[i].Trim();
				
				if (teilStr.Equals(String.Empty))
					break;
				
				if (teilPfad.Equals(String.Empty))
					teilPfad = teilStr;
				else 
					teilPfad = String.Concat(teilPfad, "/", teilStr);
				
				if (dictElement.ContainsKey(teilPfad)) {
					wurzelElement = dictElement[teilPfad];
					continue;
				}
				
				dictElement[teilPfad] = new BaumElement(teilStr);
				
				if (i==0)
					gefuelltesBaumElement.FuegeNeuesUnterelementEin(dictElement[teilPfad]);
				
				if (wurzelElement == null)
					wurzelElement = dictElement[teilPfad];
				else 
					wurzelElement.FuegeNeuesUnterelementEin(dictElement[teilPfad]);
				
				wurzelElement = dictElement[teilPfad];
			}
		}
		return gefuelltesBaumElement;
	}

Danke und Gruß,
xbredoillex