toString() methode überschreiben mit rekursivem aufruf.

Status
Nicht offen für weitere Antworten.

reliC

Mitglied
Hi all, sitze grad an nem kleinen problem mit meinem Java programm...soll ne übung sein und naja irgendwie klappts grad nicht.
Ich soll ne Klasse Stapel(Stack) implementieren mit einem push und pop welcher etwas zum stapel hinzufügt und mit pop den stack durchsucht und den gefundenenen wert zurückgibt bzw ausgibt....naja also Die Objekte auf dem Stapel sollen vom Typ Object sein. Dann soll ich eben noch für die Ausgabe die vorhandene Methode toString() überschreiben und damit dann die "String" Objekte so ausgeben:
"A,B,C...."

nun hier mal mein Code bekomme irgendwie immer ein Stackoverflow und weiß nich wo der fehler liegt....

Code:
public class Stapel {
	public int anzahl=0;
	Object[] objekt;
	
	
	public Stapel(){
		this.objekt = new Object[1000];
	}
	
	
	public void push(Object o){
			if(this.anzahl < 1000){
			this.objekt[anzahl] = o;
			this.anzahl = this.anzahl + 1;
		}
	}
	
	
	public Object pop(Object o){
		
		for(int i=0; i<this.anzahl; i++){
			if(this.objekt[i]==o){
				return this.objekt[i];
			
			}
		}return null;
	}
	
	
	public String toString(){
		
		int zaehler = -1;
		
		if(zaehler < this.anzahl){
			zaehler++;
			return this.objekt[zaehler]+","+toString();
			
		}else
			return (String)this.objekt[zaehler];
	
	}

	
}

wär echt nett wenn mir da einer ein tipp geben könnte oder geht das gar nicht so wie ich es mache mit der rekursion??

greetz reliC ach und frohe weihnachten *g*
 

Ark

Top Contributor
In welcher Reihenfolge sollen denn die Elemente ausgegeben werden?

a) ältestesElement, ..., jüngstesElement
b) jüngstesElement, ..., ältestesElement

Ark

EDIT: Seit wann wird in einem Stack gesucht?! :shock: In Stacks wird nur gefunden! Ich habe keine Ahnung, was du da implementiert hast, aber ein Stack ist das definitiv nicht.

Ark
 

reliC

Mitglied
hehe vielleicht habe ich die aufgabe falsch beschrieben, also die aufgabenstellung war so:


In dieser Aufgabe soll eine Klasse implementiert werden, die einen Stapel realisiert.
Die Klasse soll einen Konstruktor und zwei Methoden zur Verfügung stellen:
✗ Der Konstruktor hat keinen Parameter und soll einen leeren Stapel erzeugen.
✗ Die Methode push legt ein Objekt auf den Stapel.
✗ Die Methode pop nimmt ein Objekt vom Stapel und gibt es als Rückgabewert
zurück.
Detailbeschreibung:
✗ Die Objekte auf dem Stapel sollen vom Typ Object sein.
✗ Verwenden Sie zur Implementierung der Klasse die Klasse Vector.
Die Dokumentation von Vector finden Sie unter
http://java.sun.com/j2se/1.5.0/docs/api/index.html



B ) Überschreiben Sie in Stapel die Methode toString() so, dass die Stapelinhalte
durch Kommata getrennt aufgezählt werden.
 Beispiel: "auto,katze,hund"


wie ich das verstanden habe einfach vom jüngsten element zum ältesten element...denke das is so schon richtig dann gemacht nur leider bekomme ich halt ein stack overflow.... als fehlermeldung da irgendwie die rekursion nicht so funktioniert wie sie soll obwohl ich ja eine abbruchbedingung habe durch den zaehler mit dem this.anzahl der objekte die gespeichert wurden im array ;(
 

Marco13

Top Contributor
Es gibt 1000 Möglichkeiten, die toString zu implementieren. Aber in deiner Implementierung wird "toString" eben rekursiv aufgerufen, und zwar immer auf dem selben Objekt. Wenn
if(zaehler < this.anzahl){
einmal erfüllt ist, dann ist es immer erfüllt - auch beim nächsten rekursiven Aufruf.

Am einfachsten wäre es vmtl. eine Methode zu machen, die nacheinander alle Elemente des Arrays durchgeht und an einen String hängt. Falls sie unbedingt rekursiv sein soll (wozu kein Anlaß besteht) dann könnte das mit einer
private String toString(int aktuellerArrayIndex) { ... }
gemacht werden. Der rekursive Aufruf würde dann so aussehen
return .... + toString(aktuellerArrayIndex+1);

Und in der eigentlichen toString-Methode würde dann nur stehen
return toString(0);
 

reliC

Mitglied
ahhh jetzt versteh ich wo mein fehler liegt bzw wieso ich ein stack overflow hatte. Hab das dann mal so gelöst wie du gemeints hast. Dabei wird zwar toString in der Methode nicht mehr überschrieben aber ich denke das ist so schon ok:

Code:
public String toString(int zaehler){
		
		if(zaehler < this.anzahl-1){
			return this.objekt[zaehler]+","+toString(zaehler+1);
			
		}return (String)this.objekt[zaehler];
	
	}



danke für eure hilfe :toll:

greetz reliC
 

Marco13

Top Contributor
Ja nochmal: Du "musst" trotzdem in der Klasse eine Methode anbießen
Code:
public String toString()
{
    return toString(0);
}

Die 'toString' Methode wird nämlich automatisch aufgerufen, wenn man aus einem Objekt einen String macht, bzw. das Objekt ausgibt. Hier:
Code:
System.out.println(objekt);
wird (wenn 'objekt' nicht 'null' ist!) praktisch
Code:
System.out.println(objekt.toString());
ausgeführt.

Und auch nochmal: Es besteht eigentlich kein Grund, diese Methode rekursiv zu schreiben: Man könnte auch einfach mit einer for-Schleife durch den Array laufen. Aber es kann nicht schaden, wenn man bei BEIDEM weiß, wie es geht :)
 

tincup

Bekanntes Mitglied
Aber nochmal was anderes, was Ark oben schon gesagt hatte, du hast keinen Stack implementiert.

Deine Aufgabenstellung war:
reliC hat gesagt.:
Die Methode pop nimmt ein Objekt vom Stapel und gibt es als Rückgabewert
zurück.

Und die Implementierung ist:

Code:
	public Object pop(Object o){
		
		for(int i=0; i<this.anzahl; i++){
			if(this.objekt[i]==o){
				return this.objekt[i];
			
			}
		}return null;
	}

	
}

Das ist nicht das richtige. Dein pop() erfüllt eher "Die Methode pop prüft ob ein Objekt im Speicher drin ist und gibt es dann zurück, null falls nicht". Bei einem korrekten Stack gibt es mit pop() das zuletzt hinzugefügte Objekt zurück, und das ist dann nicht mehr im Stapelspeicher drin, wird also nach dem pop() gelöscht (bzw. die Referenz darauf wird gelöscht).


EDIT:

Bei Wiki kannst du es nachgucken (die ersten Abschnitte sollten für die Funktionsweise reichen):
http://de.wikipedia.org/wiki/Stapelspeicher
 

reliC

Mitglied
@marco
jetzt hab ichs klar muss ja so sein da ich sonst immer z.b x.toString(0) aufrufen...hab das jetzt geändert. Stimmt ich könnte das auch mit der for schleife lösen aber finde rekursion irgendwie schicker bzw wollte das auch mal wieder üben weil sonst hab ich alles meistens mit den schleifen gelöst.

@tincup
danke für deine hilfe hab wirklich die beschreibung für die methode pop() falsch verstanden. Hab das mal geändert denke das wär jetzt so richtig aber ich muss immer um 2 wärte verringern da er mir nach dem letzten element immer noch ein null objekt reinsetzt seh auch grad nicht wieso das so ist aber mit -2 klappt das ja auch. Falls das noch immer falsch ist was ich fabriziert habe dann bitte korriegiert mich wills ja lernen...


Code:
public Object pop(){
		
		Object o = null;
		o=this.objekt[anzahl-2];
		this.objekt[anzahl-2]=null;
		return o;
		
	}



greetz reliC
 

Andreas29

Bekanntes Mitglied
Hi,

ich möchte mich hier gerne nochmal kurz in die Diskussion einmischen:
@relic:
Verwende die Rekursion nur, wenn es gar nicht anders geht (was wie meine Vorredner schon erwähnt haben hiern icht der Fall ist). Denn Rekursion liest sich schwerer als eine einfache Schleife und ist somit, meiner bescheidenen Meinung nach, zweitrangig in der Verwendung.
Wollte ich nur mal anmerken.

Grüße und weiterhin frohe Festtage!
Andreas
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
T Sinn einer toString Methode Allgemeine Java-Themen 3
L ToString-Methode Allgemeine Java-Themen 6
sylo toString() Methode eines Interfaces überladen. Allgemeine Java-Themen 17
I Problem mit toString-Methode Allgemeine Java-Themen 6
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
M BufferedImage toString() überschreiben Allgemeine Java-Themen 5
A Bleibt toString() konstant? Allgemeine Java-Themen 8
E Seltsamer aufruf von java.util.Date.toString() Allgemeine Java-Themen 3
P Element toString Allgemeine Java-Themen 9
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
G Arrays.toString Allgemeine Java-Themen 4
G toString() von java.io.File überschreiben Allgemeine Java-Themen 8
V Einfache toString() generieren? Allgemeine Java-Themen 6
S toString() für alle Member einer Klasse. Allgemeine Java-Themen 6
G toString(), Funktionsweise? Allgemeine Java-Themen 7
M .toString() mit RegEx auseinanderpflücken. Allgemeine Java-Themen 17
B (String) und toString(), woliegt der Unterschied? Allgemeine Java-Themen 4
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben