Java, Thema: Collection

paco89

Bekanntes Mitglied
hallo, hatte folgende aufgabe (s.Bild). das thema Collection ist für mich neu und ich versuche es zu verstehen. dazu habe ich versucht diese aufgabe zu lösen, habe es allerdings nicht hingekriegt, wusste irgendwie nicht was die aufgabe von mir wollte. zum glück hatte ich die musterlösung(s.bild), aber auch da habe ich einiges nicht verstanden.

aber zuerst möchte ich zusammenfassen, was ich so alles verstanden habe und das bisschen was ich über collection weiß. also :
ich weiß, dass das interface "List" von Collection abgeleitet ist. List ist eine Gruppe von Objekten, die über Integer-Werte indiziert werden. Duplikate sind erlaubt. ein neues element kann an einer bel. position in der liste positioniert werden.
so und LinkedList implementiert das Interface "List" und speichert seine elemente in einer verketteten Liste.

so viel zu meinem wissen über collections. und nun zur aufgabenstellung: in der aufgabe wollen die doch , dass ich eine methode schreiben soll, die alle werte im baum zurückgibt. schön und gut. aber die musterlösung, da hapert´s. also:
der methodenkopf ist klar. danach wird ein neues objekt vom typ LinkedList<Integer> erzeugt. ich denke mal, dass dieses objekt auch alle werte speichern soll, da am ende der methode res ausgegeben wird.
danach ruft res die methode add(...) auf, die elemente in die liste hinzufügt. aber ab hier versteh ich das nicht.


kann mir das jmd. erklären? jede hilfe ist willkommen....
 

Anhänge

  • bild zur aufgabe.jpg
    bild zur aufgabe.jpg
    29,9 KB · Aufrufe: 42
  • aufgabenstellung.png
    aufgabenstellung.png
    28,2 KB · Aufrufe: 32
  • musterlösung.png
    musterlösung.png
    8,1 KB · Aufrufe: 36

Landei

Top Contributor
Ich denke du bist ein wenig verwirrt, weil dieser eigene Listentyp verwendet wurde, um den Baum zu implementieren, aber das spielt keine große Rolle. Bei einem binären Baum gäbe es diese "Komplikation" gar nicht, aber die Funktionsweise ist analog.

Was must du tun, um alle Werte in dem Baum auszulesen? Man muss alle Knoten rekursiv auslesen. Zuerst packe ich den Wert aus dem Knoten in die Ergebnis-Liste, dann gehe ich alle Unterknoten einen nach dem anderen durch, und mache dort genau das Gleiche. Natürlich gelange ich irgendwann an Endknoten, die keine Kinder mehr haben.
 
Zuletzt bearbeitet:

paco89

Bekanntes Mitglied
also ich frage mich zum beispiel, warum die jetzt Liste <Baum> child eingeführt haben....der zeigt doch auf den nächsten children des aktuellen objekts, oder? und was child.val.toList() machen soll, ist mir immer noch unklar.....damit will man doch den wert val von child holen, und auf diesem objekt ruft man wieder die methode toList() auf, oder wie darf ich das verstehen?
 

timbeau

Gesperrter Benutzer
So ganz logisch finde ich das auch nicht. Aber die Liste next gibt die Werte der Kinder zurück. und val enthält den eigenen Wert. Du kannst auf dem Wert val eigentlich nicht die children aufrufen auch wenn die Zeichnung das suggeriert. Also implementieren schon aber das macht irgendwie keinen Sinn.

Schreib dir einfach ne Methode und schau mal, ob die wirklich durch den Baum geht.
 

Landei

Top Contributor
also ich frage mich zum beispiel, warum die jetzt Liste <Baum> child eingeführt haben....der zeigt doch auf den nächsten children des aktuellen objekts, oder? und was child.val.toList() machen soll, ist mir immer noch unklar.....damit will man doch den wert val von child holen, und auf diesem objekt ruft man wieder die methode toList() auf, oder wie darf ich das verstehen?

Der Knoten eines Baums besteht aus einem Wert und einer Liste von Kind-Knoten (es könnte genausogut ein Array sein). Da die Anzahl der Kindknoten nicht von vornherein feststeht (wie etwa in einem binären Baum), hat man gar keine andere Wahl, als sie in irgend eine Art von Collection zu verpacken. Was ist daran schwer zu verstehen?
 

paco89

Bekanntes Mitglied
wieso rufen wir z.b. an der stelle res.addAll (child.val.toList()) noch mal die methode toList() auf? kann mir das jmd. erklären? ich komm einfach nicht drauf wieso das gemacht wird. hat das was mit der methode addAll zu tun ?

also ich hätte jetzt nur res.addAll(child.val) geschrieben....warum die jetzt noch die methode toList() aufrufen ist mir nicht ganz klar.....wie muss man das verstehen?
 

Landei

Top Contributor
Folgendes Bild: Der Baum ist ein richtiger Baum mit einem einzigen Apfel dran (label) und darunter einer Schlange von einarmigen Wanderern (children), bei denen jeder seinen Arm (next) dem Vordermann auf die Schulter legt (bis kein Vordermann mehr da ist). Außerdem hat jeder Wanderer einen Rucksack (val) auf, da ist ein Bonsai drin, der wie der große Baum einen einzigen Apfel trägt, und unter dem eine Schlange einarmiger Wichtel mit Rucksäcken anfängt.

Wie packst du nun alle Äpfel in einen Korb? Du pflückst den einen Apfel, dann sagts du dem ersten Wanderer: "Mache das gleiche wie ich mit dem Bonsai in deinem Rucksack, gib mir die Äpfel, und dein Vordermann soll das auch tun".

Den Apfel von den Bonsais zu pflücken reicht nicht, auch die Wichtel müssen angewiesen werden, in ihre Wichtel-Rucksäcke zu schauen, den Apfel von ihren Mini-Bonsais zu pflücken und die Anweisung an ihre Unter-Wichtel weiterzugeben u.s.w. -
 

HimBromBeere

Top Contributor
Klasse Antwort, Landei, kriegst´nen Daumen für dieses tolle Bild.
Das mit dem val-toList() verstehe ich so, dass jeder Value in deinem (Apfel-)Baum ja widerum belibieg viele Unterbäume haben kann, die du erstmal alle in eine Liste umwandeln musst.
 
Zuletzt bearbeitet:

Neue Themen


Oben