Beispiel 5

  • Ich komme momentan bei der Testklasse nicht weiter. Folgenden Code schrieb ich:


    Code
    1. public class Test
    2. {
    3. public static void main (String[] args)
    4. {
    5. ISTree istree = new ISTree (0);
    6. ISTree.RootEdgeIter r = new Tree.RootEdgeIter ();
    7. r.insert ("Erste Kante", 1);
    8. }
    9. }

    Das wirft die Fehlermeldung:


    Code
    1. an enclosing instance that contains Tree.RootEdgeIter is required
    2. ISTree.RootEdgeIter r = new Tree.RootEdgeIter ();
    3. ^

    Wie macht man es richtig? (RootEdgeIter ist mein Kanteniterator.)

  • Hallo!


    Sorry versteh's immer noch nicht ganz. Bedeutet die Angabe dass es im Grunde nur einen Wurzelknoten mit beliebig vielen Kanten die alle wiederum einen Folgeknoten besitzen gibt oder können diesse Folgeknoten auch wieder Folgekanten haben und die wieder Folgeknoten.....?


    Danke steh da echt voll auf der Leitung

  • Als Methode des Kanteniterators.


    Da habe ich das gleiche Problem. Als äußere Klasse kenne ich die generischen Typen nicht, als innere Klasse ist die Methode insert nicht nach außen sichtbar (für die Methode copy in der Testklasse z.B.).


    Edit: Sehe gerade, daß Du versucht hast, den Iterator mit Tree.<IteratorName> zu deklarieren. Da bin ich auch auf diesen Fehler gestoßen.
    Edit2: Mit public-deklarierten inneren Klassen geht's, aber hübsch ist das nicht.

  • Die Klasse Tree hat bei mir den Namen des RootKnotens und die erste Kante als Property.


    Kante ist ein eigenes Objekt, das den "Namen" der Kante und das Tree-Objekt des Nachfolgebaumes enthält und einen Verweis auf die in der Reihenfolge nächste Kante hat. D.h. linked List habe ich keine eigene definiert.


    Dazu kommen 2 Iteratoren, die jeweils den Kanten- bzw. Knotenwert eines Kantenobjekts zurückliefern.

  • aber im Prinzip könnte man auch sowas wie eine HashMap<A,B> implementieren und in jedem TreeObjekt dann direkt alle Kanten des Wurzelknotens in die HashMap und den zur Kante gehörigen neuen Knoten(=ein neues Tree Objekt) speichern ?

  • Diese Aufgabe ist die schlechste die ich gelesen habe - viele Mehrdeutigkeiten.


    Der Satz macht mir Probleme:


    "...Wurde next noch nie aufgerufen, dann werden Kante und Knoten ganz am Anfang eingefügt. Liefert hasNext als Ergebnis false, dann werden sie ganz am Ende eingefügt..."



    Meine Frage ist, am Anfang und Ende von was? ( Vom Baum oder von der Liste der vom Wurzelknoten ausgehenden Kanten?)


    Meine Überlegung:
    Wenn Anfang/Ende der Liste von Kanten gemeint ist, dann gibt es eine Wurzel mit Beliebig vielen Kanten und keine Kanten auf zweiter Ebene.


    Wenn Anfang/Ende des Baums, dann kann man mehr als eine Ebene haben.


    Noch eine Unklarheit beim zweiten iterator:


    Ist es erlaubt währen der zweiten Iteration, neue Kante und Knoten hinzufügen(das heisst Aufruf der ersten Iteration) ?


    Vielen Dank





    http://dict.leo.org/ende?lp=en….&search=Doppeldeutigkeit

  • acko
    du hast ja deinen wurzeknoten und iterierst über die bestehenden kanten und merkst dir immer, bei welcher kante du gerade bist


    wenn du next noch nie aufgerufen hast, bist du bei keiner kante, also sozusagen -1 und fügst dort die kante bzw knoten ein (also vor der 1. bestehenden kante)


    wenn hasNext false liefert, bist du am ende deiner schon bestehnden kanten (bzw knoten) angelangt und fügst dort die kante ein..also am ende..


    du hast bei deinem iterator also immer nur einen teilbaum mit root, den ausgenden kanten und die kinder von root..

    mfG Phoenix

    errare humanum est

  • wenn du next noch nie aufgerufen hast, bist du bei keiner kante, also sozusagen -1 und fügst dort die kante bzw knoten ein (also vor der 1. bestehenden kante)


    wenn hasNext false liefert, bist du am ende deiner schon bestehnden kanten (bzw knoten) angelangt und fügst dort die kante ein..also am ende..


    Ok, wie siehts aus, wenn ich Kante 5 einfüge, und gleich danach Kante 10, dann sollte die Liste die Elemente [10,5] enthalten oder?


    Wenn ich nun zb Kante 5 einfüge, dann ein next() und dann Kante 10 sollte die Reihenfolge so aussehen: [5,10].


    Und wenn ich jetzt noch Kante 5, next(), kante 10 und darauf Kante 15 einfüge, dann sollte es doch so aussehen oder? [5,15,10]


    Richtig? :confused:


    lg

  • ja genau so hab ichs verstanden und auch implementert..darum auch eine linkedlist, da du ja die verweise next und last einer kante bzw knoten ändern musst, wenn du zwischen 2 knoten etwas einfügst..

    mfG Phoenix

    errare humanum est

  • aber im Prinzip könnte man auch sowas wie eine HashMap<A,B> implementieren und in jedem TreeObjekt dann direkt alle Kanten des Wurzelknotens in die HashMap und den zur Kante gehörigen neuen Knoten(=ein neues Tree Objekt) speichern ?


    Wenn dann eine MultipleHashMap, da ja Knotenbezeichnungen nicht eindeutig sein müssen.


    Edit: Außerdem mußt Du die Reihenfolge beachten:


    Quote

    [..] Erzeugen eines Iterators, der alle Bezeichner von vom Wurzelknoten ausgehenden Kanten in fixer Reihenfolge (siehe unten) liefert. [..]

  • ja genau so hab ichs verstanden und auch implementert..darum auch eine linkedlist, da du ja die verweise next und last einer kante bzw knoten ändern musst, wenn du zwischen 2 knoten etwas einfügst..


    Ok, ich probiers die ganze Zeit mit einer einfach verketteten Liste und schaffs nicht, du benutzt also eine doppelte (und einen Iterator für die Liste)?


    lg

  • ja genau so hab ichs verstanden und auch implementert..darum auch eine linkedlist, da du ja die verweise next und last einer kante bzw knoten ändern musst, wenn du zwischen 2 knoten etwas einfügst..



    Einfach verkettet müßte auch reichen, weil man die Liste nur in eine Richtung durchläuft.

  • Dieselben wie der erste, nur einen anderen Rückgabetyp bei next().



    ok das hab ich auch soweit und funktionierend bis auf das inserten... wie soll das gehen beim 2. iterator, wenn ich als startelement immer die root des ursprungbaumes habe? da kommt man ja nie in die tiefe.. oder macht ihr jeden node zu einem tree?


    edit: natürlich! hab viel zu kompliziert gedacht