Java Stack Object Contains Methode realisieren. Aber wie?

FrazeColder

Lt. Commander
Dabei seit
Okt. 2013
Beiträge
1.591
Hey Community,

Wir beschäftigen uns gerade mit Stacks und sollen diese in Java implementieren. Leider häng ich bei einer klasse...
Alle anderen Methoden wie z.B. pop(), push() etc. funktionieren.

Die Klasse Contains soll im Stack nach dem Element im Stack suche. Ich weiß dass ich immer wieder den Vorgänger vom Vorgänger aufrufen muss. Aber wie übergebe ich dann das gefunden Objekt?

Das habe ich bisher:

Code:
	public boolean contains(Object obj){
		int size = getSize();
		Element temp = top;
		
		for(int i = 0; i <= size; i++){
			temp.getVorgaenger();
			temp = temp.getVorgaenger();			
		}
		
		return true;
	}
MfG und Danke!
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Contains erwartet ja nicht die Rückgabe des entsprechenden Elementes, sondern nur true/false.

Da ein klassischer Stack nur push/pop kann, musst du notgedrungener Weise solange poppen, bis du das Element gefunden hast oder du ganz unten im Stack angelangt bist. Danach wieder alles in umgekehrter Reihenfolge pushen.

Bei deiner aktuellen Methodensignatur musst du auch sicherstellen, dass dein übergebenes Objekt comparable ist. Außerdem fehlt deiner Methode noch eine prüfung ala :
Code:
stackObj.equals(obj)
 
Zuletzt bearbeitet:

crvn075

Lt. Junior Grade
Dabei seit
Juli 2015
Beiträge
429
Dein Code erweckt den Eindruck, dass die Elemente in deinem Stack intern in einer Art verketteten Liste abgelegt werden. Falls dem so ist:

Code:
for(int i = 0; i < size; i++){
   if(temp.equals(obj)) return true;
   temp = temp.getVorgaenger();			
}	
return false;
 

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.591
Irgendwie wirft er mir ne NullPointerException in
"temp = temp.getVorgaenger();"
 
Zuletzt bearbeitet:

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.591
Ich habe es jetzt so herum. Ist ja aber das selbe. Oder?

(int i = size; i >= 0; i--)

Und wieso will das nicht?
Unbenannt.png
 

crvn075

Lt. Junior Grade
Dabei seit
Juli 2015
Beiträge
429
Das ist eine andere Baustelle.

Du baust einen Stack für den generischen Typ Element. Wenn das gewollt sein sollte, dann muss dieser Typ aber auch generisch sein, was er laut Error nicht ist.

Wie konntest du vorher überhaupt auf eine Nullpointer-Exception stoßen, wenn dein Programm nicht mal kompiliert?

Ich habe es jetzt so herum. Ist ja aber das selbe. Oder?
(int i = size; i >= 0; i--)
Das ist sinngemäß das selbe, was du am Anfang hattest und ergo nicht funktionieren wird.

Wenn size z.b. 5 ist, dann läuft die Schleife 6 mal durch (für 5, 4, 3, 2, 1, 0).
 
Zuletzt bearbeitet:

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.591
Siehe hier...

Code:
package Generic_Stack;

public class Element<E> {

	private Element<E> vorgaenger;
	private E daten;
	
	Element(E daten){
		this.daten = daten;
	}
	
	public E getDaten(){
		return daten;
	}
	
	public void setDaten(E object){
		daten = object;
	}
	
	public Element<E> getVorgaenger(){
		return vorgaenger;
	}
	
	public void setVorgaenger(Element<E> vorgeanger){
		this.vorgaenger = vorgeanger;
	}

}
 
V

VikingGe

Gast
Zitat von crvn075:
Wie konntest du vorher überhaupt auf eine Nullpointer-Exception stoßen, wenn dein Programm nicht mal kompiliert?
Aus Eclipse heraus kann man tatsächlich Programme starten, die nicht compilieren - wenn eine fehlerhafte Stelle im Code aufgerufen wird, gibts halt eine Exception.

Nebenbei ist ein Stack auch eine Struktur, die man wunderbar rekursiv definieren kann. Ich würde die Contains-Methode einfach in Element<E> implementieren - rekursiv - und dann in der Stack-Klasse selbst nur Contains-Methode des top-Elements aufrufen.

Nach welchem Prinzip geht man da vor?
- Speichert das Element schon den gesuchten Wert? Wenn ja -> return true
- Hat das Element einen Vorgänger? Wenn ja, untersuche diesen
- Wenn nicht -> return false

Was hat das für einen Vorteil?
- Du sparst dir das Geraffel mit der Schleife und musst nicht darüber nachdenken, bis wohin du zählen musst.

Übrigens hast du in der peek()-Methode auch noch einen Fehler - false ist kein Element<T> ;)
 
Zuletzt bearbeitet:

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.591
Mal abgesehen von den Fehlern, wo ich leider noch keine Zeit hatte sie zu fixxen, wo liegt hier der Fehler ... -.-?

Funktioniert nicht... Oben ist meine Element Klasse!
photo_2015-11-19_20-29-09.jpg
 

striker159

Lt. Junior Grade
Dabei seit
Dez. 2008
Beiträge
304
deine peek methode gibt einen falschen datentyp zurück. (typ E, aber return false). vielleicht stört sich eclipse dadurch an den anderen deklarationen. ein minimal beispiel mit deinem code zeigt bei mir keine fehler

 
Zuletzt bearbeitet:

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.591
Nein, ich weiß jetzt woran...
Und es geht jetzt auch :D

Ganz am Anfang!
"import.Stack.Element"
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Hier fehlt es meines Erachtens an elementarem Grundverständnis bzgl. Objekten, simplen Datentypen, Übergabe- und Rückgabewerte, usw. usf.
Die gesamte Lösungsfindung des TE ähnelt Try & Error und keinem strukturierten Vorgehen.

@FrazeColder: Für was für eine Ausbildung /Studium auch immer du diese Übung durchführst, geh nochmal ein paar Kapitel zurück und befasse dich mit den Grundlagen, sonst fällst du spätestens wenn du auf dich allein gestellt bist mächtig auf die Nase.
Ergänzung ()

Bevor du anfängst mit einer IDE zu programmieren, versuche die Abhängigkeiten zwischen verschieden Klassen, Paketen, Sichtbarkeiten zu verstehen und beginne simple Programme in einem simplen Editor zB NP++ zu schreiben und diese per bash zu kompilieren und auszuführen.
 

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.591
Ich weiß ja was static, konstruktoren, paramenter etc. sind und wie man die benutzt.
Nur haben wir da so ein Lehrer, der eher weniger erklärt als Aufgaben stellt.

Daher ist das anlernen auch Try&Error. Und den Fehler mit dem return von false war nur, weil ich da gerade etwas in Eile war und nicht sonderlich drauf geachtet habe und eher mit Generics beschäftigt war...

Ich sitze echt sehr lange an Hausaufgaben, da wir uns selbst beibringen müssen, wie wir was implementiere....
 
Top