Java Generischer Iterator über Baumstruktur

Gaggi123

Ensign
Registriert
Feb. 2007
Beiträge
248
Hallo zusammen!

Ich knobel mir momentan die Birne weich aber eventuell übersehe ich auch nur etwas:
Ich möchte gerne den Inhalt eines Baumes mittels Iterator in eine LinkedList<T> adden. Die Funktionen für die LinkedList kann ich aus dem java.util importieren. Mir geht es primär um die Implementation des Iterators in Zeile 24 und 25:

Code:
// (C) 2009-10 Ralf Laemmel

package tree;

import java.util.Iterator;
import java.util.LinkedList;

public class BinTrees<T> implements Iterator<T> {

	public T info;
	public BinTrees<T> left, right;
	private Iterator<T> treeIterator;

	public void print() {
		System.out.println(this.info);
		if (left != null)
			left.print();
		if (right != null)
			right.print();
	}

	public LinkedList<T> convert(BinTrees<T> x) {
		LinkedList<T> tmp = new LinkedList();
		treeIterator = x.iterator(); // hier ist die Baumstruktur nicht
							  // kompatibel mit dem .iterator() Befehl
		while (hasNext()) {
			tmp.add(treeIterator.next());
		}
		return tmp;
	}

	public static int sum(BinTrees<Integer> x) {
		return x == null ? 0 : x.info + (x.left != null ? sum(x.left) : 0)
				+ (x.right != null ? sum(x.right) : 0);
	}

	public static void main(String[] args) {
		BinTrees<Integer> t1 = new BinTrees<Integer>();
		BinTrees<Integer> t11 = new BinTrees<Integer>();
		BinTrees<Integer> t12 = new BinTrees<Integer>();
		BinTrees<Integer> t121 = new BinTrees<Integer>();
		t1.info = 1;
		t1.left = t11;
		t1.right = t12;
		t11.info = 2;
		t12.info = 3;
		t12.left = t121;
		t121.info = 4;
		t1.print();
		System.out.println(sum(t1));
		System.out.println("To LinkedList: ");
		System.out.println(t1.convert(t1));
	}

	public boolean hasNext() {
		if (left == null && right == null) {
			return false;
		}
		return true;
	}

	public T next() {
		while (hasNext()) {
			if (left != null) {
				left.next();
			}
			if (right != null) {
				right.next();
			}

		}
		return info;
	}

	public void remove() {
		// TODO Auto-generated method stub

	}
}
 
Code:
public class BinTrees<T> implements Iterator<T> {
Diese Zeile sagt aus, dass es eine Klasse BinTrees gibt, die das Iterator-Interface implementiert. Das bedeutet, dass jedes(!) BinTrees-Objekt gleichzeitig ein Iterator ist.

Code:
treeIterator = x.iterator();
Das funktioniert deswegen auch nicht. x ist ein BinTrees-Objekt und gleichzeitig auch der Iterator.
Es müsste dann also
Code:
treeIterator = x;
oder alternativ
Code:
treeIterator = x.treeIterator;
heißen. Wobei letzteres nicht die feine englische Art ist. Damit würde man das Geheimnisprinzip durchbrechen.

Aber so oder so, der ganze Code schaut ziemlich wirr aus. Du experimentierst da wohl schon länger, was? ;)


Ich rate dir, das Ganze in zwei Klassen aufzuteilen: Zuerst eine Klasse für den Baumknoten/-blatt, die das Iterable-Interface implementiert. Und dann noch eine dazu passende BaumIterator-Klasse, die das Iterator-Interface implementiert.
Das Konzept bestehen nämlich immer aus zwei Teilen: Etwas, über das iteriert wird und etwas, dass die Iteration durchführt.

Dieser Anstoß könnte schon reichen, damit du das hinbekommst.

Gruß, Laurin
 
Hallo e-Laurin,

danke für die Antwort! Für gewöhnlich arbeite ich auch entsprechend, allerdings war dieses package bereits recht voll und ich war ein wenig faul eine weitere Klasse anzulegen ;) War auch eher als Experiment gedacht.
Tatsächlich kommt die Konsole nun auch zu einem Ende!
 
Zurück
Oben