Laden...

Tree

Erstellt von malignate vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.621 Views
malignate Themenstarter:in
742 Beiträge seit 2005
vor 19 Jahren
Tree

Ich bräuchte ein Tree-Klasse mit folgenden Node:

ein Datanode für Integer. Dieser Node kann keine weitere Nodes mehr aufnehmen.

ein Datanode für Floats. Dieser Node kann keine weitere Nodes mehr aufnehmen.

Ein Groupnode. Dieser Node kann datennodes und andere groupnodes aufnehemen und wird über einen string angesprochen.


node* n = root.get( "texture" ).get( "data" );

Wie soll ich das realisieren?

Ich hätte das gerne Typensicher und ohne casts.

_
416 Beiträge seit 2005
vor 19 Jahren

Eine Möglichkeit: (wahrscheinlich stark verbesserungswürdig 😉

 
public interface INode {
    public string Name;
}

public class FloatNode : INode{
    private string name;
    private float val;

    public FloatNode(string name, float value) {
        this.name = name;
        this.val = value;
    }

    public string Name { get { return name; } }

    public float Value { 
        get { return value; }
        set { val = value; }
    }
}

// das gleiche nochmal für int

public class GroupNode : INode {
    private ArrayList nodes;
    private string name;

    // Konstruktor

    // getter für Name

    public void Add(INode node)
    {
        nodes.Add(node);
    }

    //noch weitere Funktionen um z.B. nodes abzufragen, bzw. zu löschen    
}

Ich hab hier eine ArrayList für den GroupNode verwendet. Aus dem einfachen Grund: normalerweise willst du den Baum geordnet aufbauen. So musst du allerdings in der get Methode durch alle nodes durch gehen und den Namen vergleichen. Mit nem Hashset wäre die Abfrage natürlich einfacher, da du dort einen Key hast, allerdings sind dann die Knoten ungeordnet.

malignate Themenstarter:in
742 Beiträge seit 2005
vor 19 Jahren

So wie du das hast ist klar.... aber wie erfolgt die Abfrage der Daten?

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo malignate,

ich vermute mal, du meinst mit 'abfragen', den Zugriff per String auf die entsprechende Groupnode.

Wenn die Strings die Groupnodes eindeutig identifizieren, ist eine Hashtable zur Realisierung ganz praktisch. Es könnte eine solche Hashtable als statische Variable in der Klasse Groupnode geben. In diese wird im Konstruktor oder beim Setzen des Strings die aktuelle Groupnode - mit dem String als Key - eingetragen. Eine statische Methode der Klasse Groupnode könnte dann mit Hilfe der Hashtable und dem als Paramter übergebenen String leicht die gewünschte Groupnode zurückliefern.

HTH

herbivore

_
416 Beiträge seit 2005
vor 19 Jahren

Hi

@herbivore:
zwei Dinge gefallen mir an deinem Vorschlag nicht so recht

  1. die Hashtable. warum hatte ich oben geschrieben
  2. diese als statisch markiert: wenn man das tut braucht man auch keinen Baum mehr. Außerdem, was passiert wenn man mehrere Knoten im Baum gleich benennen will. Oder was noch wahrscheinlicher ist, mehrere Bäume hat und dort sich Knotennamen gleichen?

ich würde den Zugriff einfach so machen:

(ausgehend vom oben genannten code, eingefügt in die GroupNode-Klasse)

public INode this[int index] { return nodes[i]; }
public INode this[string name] {
    foreach(INode node in nodes)
        if (node.Name==name) return node;

    return null;
} 

Zugriff erfolgt dann ganz einfach über: root["texture"]["data"]
wenn du weißt das das ein Float-Wert sein soll, dann
FloatNode node = root["texture"]["data"] as FloatNode;
if (node==null) // Fehler
node.Value = ...

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo tb,

zu 1. die Ordnung in einem Baum entsteht durch die Kanten zwischen den Knoten und nicht durch die mögliche Strukturierung eines zusätzlichen Index. Die Hashtable geht also schon in Ordnung.

zu 2. Natürlich und absichtlich static. Meine Voraussetzung war: "Wenn die Strings die Groupnodes eindeutig identifizieren". Wenn diese Voraussetzung erfüllt ist, handelt es sich hier um einen Index aller zu der Klasse erzeugten Objekte und den Zugriff auf diese per Id. Es ist dabei völlig unerheblich, ob die einzelnen Knoten in einem Baum enthalten sind oder sich auf einen ganzen Wald verteilen. Das static geht also schon in Ordnung. Ob die genannten Methoden als solche sinnvoll sind, steht und fällt mit der Einhaltung der Voraussetzung.

herbivore