Rekursion & Bäume

Davtorik

Mitglied
Hallo

Ich möchte ein Programm programmieren, das Gegenstände aufnehmen kann, und in einer Baumstruktur ausgibt. Ich habe schon ein paar Klassen vorgeben. (meine Liste wird direkt als String in „Baumform“ ausgegeben, ich schreibe also den „Baum“ in eine JTextarea). Dabei sollen auch rekursive Methoden angewandt werden.
Bisher hab ich folgende Methoden, aber sie funktionieren nicht, und ich weiß ehrlich gesagt auch nicht mehr weiter:


Code:
/**
 * Zur Aufnahme eines Gegenstandes in das Inventar. Diese Methode schreibt die Daten wie 
 * Name, Anschaffungspreis usw. des neuen Gegenstandes in die Datei. 
 * Die Methode gibt einen boolschen Wert zurück, welcher die erfolgreiche Speicherung
 * bestätigen soll. 
 * @param neuerGegenstand - Der Gegenstand, der aufgenommen werden soll.
 * @param pfad - Die Stelle, an die der Gegenstand hinzugefügt werden soll.
 * @return true, wenn der Gegenstand aufgenommen werden konnte.
 */
public boolean gegenstandAufnehmen(MeinComponent neuerGegenstand, String pfad) 
{	
	boolean aufgenommen = false;
	String ersterTeilDesPfades, restlicherPfad;
	InterfaceComponent stelleVomBaum;
	boolean suchen = true;
	try
	{
		int stelle = pfad.indexOf('/');
		ersterTeilDesPfades = pfad.substring(0, stelle);
		
		stelleVomBaum = meinInventar.getErstesKind();
		
		if(stelleVomBaum.equals(ersterTeilDesPfades))
		{
			restlicherPfad = pfad.substring(stelle + 1, pfad.length());
			if(restlicherPfad.length() < 1)
			{
				stelleVomBaum = meinInventar.getAktuell();
				stelleVomBaum.hinzufuegen(neuerGegenstand);
				aufgenommen = true;
				meinInventar.setzeAktuellAufAnfang();
			}
			else
			{
				gegenstandAufnehmen (neuerGegenstand, restlicherPfad);
			}
		}
		else
		{
			stelleVomBaum = meinInventar.getNaechster();
			if(stelleVomBaum == null)
			{
				aufgenommen = false;
			}
			while(stelleVomBaum != null && suchen)
			{
				if(stelleVomBaum.equals(ersterTeilDesPfades))
				{
					restlicherPfad = pfad.substring(stelle + 1, pfad.length());
					if(restlicherPfad.length() < 1)
					{
						stelleVomBaum = meinInventar.getAktuell();
						stelleVomBaum.hinzufuegen(neuerGegenstand);
						aufgenommen = true;
						meinInventar.setzeAktuellAufAnfang();
						suchen = false;
					}
					else
					{
					gegenstandAufnehmen (neuerGegenstand, restlicherPfad);
						suchen = false;
					}
				}
				stelleVomBaum = meinInventar.getNaechster();
			}
		}
	}
	catch(Exception e)
	{
		aufgenommen = false;
	}
	return aufgenommen;	
	}

Ich hab schon debugged, und es funktioniert nicht, weil das ersteKind = null ist. Hier ist meine getErstesKind Methode:

/**
 * Gibt das erste Kind-Element zurueck und setzt das aktuelle Element auf dieses Element, 
 * falls das aktuelle Element nicht vom Typ Container ist, wird null zurückgegeben.
 * @return erstesKind - Das erste Kindelement
 */
@Override
public InterfaceComponent getErstesKind()
{
	InterfaceComponent aktuellesElement = getAktuell();
	Object meinKindObjekt;//Objekt, dass dann gecastet wird
	InterfaceComponent erstesKind = null;
	if(aktuellesElement instanceof Container)
	{
		erstesKind = null;
	}
	else
	{
		if(!aktuellesElement.getListe().isEmpty())
		{
			meinKindObjekt = aktuellesElement.getListe().get(0);
			erstesKind = (InterfaceComponent)meinKindObjekt;
			aktuellesElement = erstesKind;
		}
	}
	return erstesKind;
}

Was mich weiter interessieren würde, ob meine getVater, so wie ich sie implementiert hab funktionieren würde (rekursiv):

/**
 * Gibt das Vater-Element zum aktuellen Element zurück und setzt das aktuelle Element auf 
 * dieses Element.
 * @return vaterElement - Der Vater zum aktuellen Element
 */
@Override
public Container getVater()
{		
	Container vaterElement = null;
	InterfaceComponent aktuellesElementdessenVaterGesucht = getAktuell();
	setzeAktuellAufAnfang();
	vaterElement = sucheVater(aktuellesElementdessenVaterGesucht);
	return vaterElement;
}

/**
 * Sucht den Vater des aktuellen Elements.
 * @param aktuellesElement - Das Element, dessen Vater gesucht wird
 * @return vaterElement - Der Vater des aktuellen Elements
 */
private Container sucheVater(InterfaceComponent aktuellesElement)
{
	Container vaterElement = null;
	int stelle = 0;
	InterfaceComponent neuesAktuellesElement = getAktuell();
	InterfaceComponent erstesKind = getErstesKind();
	Object kind;
	InterfaceComponent vergleichsComponent;
	do
	{
		kind = erstesKind.getListe().get(stelle);
		vergleichsComponent = (InterfaceComponent)kind;
		if(vergleichsComponent.equals(aktuellesElement))
		{
			vaterElement = (Container)erstesKind;
			neuesAktuellesElement = vaterElement;
			kind = null;
		}
		stelle++;
	}
	while(kind != null);
	if(vaterElement == null)
	{
		neuesAktuellesElement = erstesKind;
		sucheVater(aktuellesElement);
	}
	return vaterElement;
}
 
Zurück