Prüfen ob Element in ArrayList

Glühwürmchen

Mitglied
Huhu 🙂

Also es geht um folgenes: Ich hab ein Kartenspiel erstellt und will jetzt Prüfen ob eine bestimmte Karte in meinem Stapel enthalten ist.
Jedoch wird mir immer geliefert, dass die Karte nicht enthalten ist. Ich habe bisher 2 Versionen:

Java:
public void pruefung(Typ farbe, Wert wert){
		Card2 Karte = new Card2(farbe, wert);
		if(Stapel.contains(Karte)){
			System.out.println("Die Karte " + Karte + " ist im Stapel enthalten.");
		}
		else System.out.println("Die Karte " + Karte + " ist nicht im Stapel enthalten.");
	}

Java:
public void pruefung(Typ farbe, Wert wert){
		Card2 Karte = new Card2(farbe, wert);
		boolean kent = false;
		for(int i=0; i<Stapel.size(); i++){
			if((Stapel.get(i)).equals(Karte)){
				kent = true;
			}
		}
		if(kent == false){
			System.out.println("Die Karte " + Karte + " ist nicht im Stapel enthalten.");
		}
		else System.out.println("Die Karte " + Karte + " ist im Stapel enthalten.");
	}

Jedoch funktioniert beides nicht. Mit contains() will es nicht und mit equals() auch nicht. Und mehr hab ich nicht im Internet gefunden... vor allem laut dem was ich im Internet gefunden habe, müsste es eigentlich mit contains() funktionieren, aber leider will es nicht. Also was kann ich jetzt noch probieren?
 
Wie kann dein Stapel eine gerade neu erzeugte Karte als Javaobjekt kennen, die dem Stapel übehaupt nicht hinzugefügt wurde?
 
Achso, das hätt ich vielleicht noch erwähnen sollen ^^
Also ich hab noch das hier:

Java:
public void deckErstellen(){
		for (Typ farbe : Typ.values()){                              
	       for (Wert wert : Wert.values()){
	             Stapel.add(new Card2(farbe, wert));
	       }
		}
	}

Und in der Main hab ich ja schon ein komplettes Deck erstellt und will dann die Methode benutzen um zu prüfen ob eine bestimmte Karte enthalten ist.

Ich hab übrigens keine equals-Methode selbst geschrieben, sollte ich das wohl noch extra machen? Funktionierts dann?
 
Das ist ein imho sehr schlechter Weg. Hast du equals überschrieben? Ansonst kannst du nur Referenzgleiche Objekte finden (Basisimplementierung.)

€: Letzte Zeile überlesen. 😳

Laut Javadoc: (o==null ? e==null : o.equals(e)).
Equal überprüft im Default, ob die beiden Instanzen == sind. Das funktioniert nur folgendermaßen:

Java:
Card2 card = new Card2(farbe, wert);
list.add(card);
System.out.println(list.contains(card));

True.

Java:
Card2 card = new Card2(farbe, wert);
list.add(card);
System.out.println(list.contains(new Card2(farbe, wert)));

False.

Denn die beiden Karten enthalten standartgemäß die selben Werte, sind aber nicht die selben Instanzen, wonach geprüft wird.
 
Zuletzt bearbeitet:
Wenn du mit

Card2 Karte = new Card2(farbe, wert);

eine neue Karte erzeugst, isrt dieses Javaobjekt nicht in der Liste enthalten (Fall 1) und die equals Methode funktioniert nur wenndu sie überschrieben hast (Fall 2)
 
Wenn du equals nicht selbst implementierst, dann vergleicht java bei Objekten, ob die Objekt-ID gleich ist. Da die Karte im Stapel und die neu erzeugte Karte nicht die selbe ID haben, ist sie nicht im Stapel auffindbar.

Du musst also die Methode equals selbst implementieren.

E: Notiz an mich, nur 1 Tab zur gleichenzeit öffnen und durchlesen, dann kommen die Antworten nicht viel zu spät).
 
Wohoo~ ich habs hinbekommen 😀

Ich hab das jetzt so gemacht:
Java:
	public boolean equals(Card2 Karte, Card2 Karte2){
		if (Karte2.getWert() == Karte.getWert()){
			if (Karte2.getTyp() == Karte.getTyp()){
			return true;
			}
			else return false;
		}
		else return false;

Und nun liefert es mir immer das richtige Ergebnis 😀
 
Java:
public boolean equals(Object obj)
{
	if(!(obj instanceof Card2))
		return(false);
	Card2 cast = (Card2)obj;
	return(getWert() == cast.getWert() && getTyp() == cast.getTyp());
}

So implementiert kannst du auch contains verwenden. Ich würde dir aber raten, das Design nochmal zu überdenken. Eine neue Karte zu erzeugen nach dem der Stapel bereits befüllt wurde ist komisch und unrealistisch.
 
So implementiert kannst du auch contains verwenden. Ich würde dir aber raten, das Design nochmal zu überdenken. Eine neue Karte zu erzeugen nach dem der Stapel bereits befüllt wurde ist komisch und unrealistisch.

Hmm~ naja, aber in meiner Aufgabe stand, ich soll eine Methode schreiben, der man eine Karte als Parameter übergibt und sie soll dann schauen ob diese auch im Stapel vorkommt. Und wenn ich da dann nicht ein neues Objekt vom Typ Card2 erstellt hab, dann hats nicht funktioniert.
 
casten zu Card2

Wir wollen hoffen, dass du keine Steuerung für Herzschrittmacher o.a. programmierst. Ach egal wie schnell, Hauptsache überhaupt.....
 
casten zu Card2

Wir wollen hoffen, dass du keine Steuerung für Herzschrittmacher o.a. programmierst. Ach egal wie schnell, Hauptsache überhaupt.....

Mit Casten kenn ich mich noch garnicht aus, ehrlich gesagt ^^
Muss ich mich noch einlesen ^^

Und ich muss das hier nur für die Uni machen und wenn ich dann eben nicht die volle Punktzahl bekomme, dann ists auch okay... find ich 🙂
Und nein, ich werd nie was für Herzschrittmacher programmieren xD
 
Was hat nichts funktioniert? Es hat ja allgemein nicht funktioniert. Die Liste kennt die Karte, und die Methode kennt die Karte, und es wird geschaut ob beide Karten ident sind. Wenn du ein Deck aus 52 Karten hast, und eine neue Karte aus einen anderen nimmst, wird diese Karte auch nicht im ursprünglichen Deck vorhanden sein, geht ja gar nicht. ^^
Du kannst nur schauen, ob eine Karte mit dem selben Wert und der Farbe vorkommt, was die equals macht. Aber nur zum prüfen ob eine Karte dabei ist hohlt man sich ja kein neues Kartenspiel, sondern verwendet eine Karte aus den ursprünglichen Karten zum Vergleich. (Recht komisch erklärt, aber ich hoffe es ist verständlich.)
 
Was hat nichts funktioniert? Es hat ja allgemein nicht funktioniert. Die Liste kennt die Karte, und die Methode kennt die Karte, und es wird geschaut ob beide Karten ident sind. Wenn du ein Deck aus 52 Karten hast, und eine neue Karte aus einen anderen nimmst, wird diese Karte auch nicht im ursprünglichen Deck vorhanden sein, geht ja gar nicht. ^^
Du kannst nur schauen, ob eine Karte mit dem selben Wert und der Farbe vorkommt, was die equals macht. Aber nur zum prüfen ob eine Karte dabei ist hohlt man sich ja kein neues Kartenspiel, sondern verwendet eine Karte aus den ursprünglichen Karten zum Vergleich. (Recht komisch erklärt, aber ich hoffe es ist verständlich.)

Ja es ist verständlich 🙂
Also war das mein Denkfehler bei der ersten Idee. Nur hatte ich es eben so verstanden, dass ich ein Deck habe. Dann zieht man ein paar Karten. Und dann sagt man, dass man wissen will, ob eine bestimmte Karte noch enthalten ist. Im Grunde könnte man es so auch über nen Umweg machen fällt mir grad ein... also indem man schaut wie groß der Stapel ist, wenn noch 52 Karten drin sind, dann muss sie noch drin sein und sonst schaut man ob man die Karte schon gezogen hat. Nur das dann zu implementieren... das ist mir zu hoch, da wüsst ich nicht wie und ich werds auch nich alles nochmal umschreiben xD

Du übergibst keine Karte, sondern 2 Parameter, die du dann zu einer Karte machst.

Okay, seh ich ein. Aber ich habs so gemacht, weil ichs anders nicht kann xD
 
Okay, seh ich ein. Aber ich habs so gemacht, weil ichs anders nicht kann xD

Du hast doch jetzt:
Java:
public void pruefung(Typ farbe, Wert wert){
        Card2 Karte = new Card2(farbe, wert);
...
}
Das schreibst du einfach um in:
Java:
public void pruefung(Card2 karte){ //Variablen klein schreiben, in der restlichen Methode auch
...
}
Und dann passt es schon. Dann rufst du es eben nicht als
Code:
pruefung(Typ.Pik, Wert.Ass)
auf, sondern als
Code:
pruefung(new Card2(Typ.Pik, Wert.Ass))
 

Zurück
Oben