# Prüfen ob Element in ArrayList



## Glühwürmchen (5. Jun 2011)

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:


```
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.");
	}
```


```
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?


----------



## awda23ws23 (5. Jun 2011)

Wie kann dein Stapel eine gerade neu erzeugte Karte als Javaobjekt kennen, die dem Stapel übehaupt nicht hinzugefügt wurde?


----------



## XHelp (5. Jun 2011)

Sicher, dass die equals-Methode der Karte richtig funktioniert?


----------



## Glühwürmchen (5. Jun 2011)

Achso, das hätt ich vielleicht noch erwähnen sollen ^^
Also ich hab noch das hier:


```
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?


----------



## Volvagia (5. Jun 2011)

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:


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

True.


```
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.


----------



## awda23ws23 (5. Jun 2011)

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)


----------



## XHelp (5. Jun 2011)

Glühwürmchen hat gesagt.:


> Ich hab übrigens keine equals-Methode selbst geschrieben, sollte ich das wohl noch extra machen? Funktionierts dann?



"Ja" und "vermutlich ja"


----------



## Glühwürmchen (5. Jun 2011)

Volvagia hat gesagt.:


> Das ist ein imho sehr schlechter Weg.



*g* naja, ich bin noch blutige Anfängerin und stümper teilweise noch sehr rum ^^''''

Na dann versuch ich das doch gleich mal und mach ne equals-Methode 
Danke!


----------



## Dekker (5. Jun 2011)

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).


----------



## Glühwürmchen (5. Jun 2011)

Wohoo~ ich habs hinbekommen 

Ich hab das jetzt so gemacht:

```
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


----------



## XHelp (5. Jun 2011)

Das ist zwar eine Methode, die equals heißt, aber nicht *DIE* equals Methode: [japi]Object#equals[/japi]


----------



## Volvagia (5. Jun 2011)

```
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.


----------



## firewarrior (5. Jun 2011)

Und dann bitte auch an den equals() contract halten. (Die Bedingungen, die im Link unter der equals() Methode stehen)


----------



## Glühwürmchen (5. Jun 2011)

XHelp hat gesagt.:


> Das ist zwar eine Methode, die equals heißt, aber nicht *DIE* equals Methode: [japi]Object#equals[/japi]



Ja stimmt schon ^^
Aber ich wusste nicht genau wie ich das machen soll wenn ich nur ein Objekt als Argument übergebe. Und im grunde muss es doch denk ich nur funktionieren...


----------



## Glühwürmchen (5. Jun 2011)

Volvagia hat gesagt.:


> 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.


----------



## awda23ws23 (5. Jun 2011)

casten zu Card2

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


----------



## XHelp (5. Jun 2011)

Glühwürmchen hat gesagt.:


> 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.



Dann hast du die Aufgabe aber verfehlt, denn du hast du hast keine Methode, der du *eine Karte* als Parameter übergibst.


----------



## Glühwürmchen (5. Jun 2011)

awda23ws23 hat gesagt.:


> 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


----------



## Glühwürmchen (5. Jun 2011)

XHelp hat gesagt.:


> Dann hast du die Aufgabe aber verfehlt, denn du hast du hast keine Methode, der du *eine Karte* als Parameter übergibst.



Warum das? Ich kann doch jetzt in meiner Main z.B. schreiben:

```
karten.pruefung(Typ.Pik, Wert.Ass);
```

Ist doch eine als Parameter übergebene Karte, oder nicht?


----------



## Volvagia (5. Jun 2011)

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.)


----------



## XHelp (5. Jun 2011)

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


----------



## Glühwürmchen (5. Jun 2011)

Volvagia hat gesagt.:


> 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



XHelp hat gesagt.:


> 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


----------



## XHelp (5. Jun 2011)

Glühwürmchen hat gesagt.:


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



Du hast doch jetzt:

```
public void pruefung(Typ farbe, Wert wert){
        Card2 Karte = new Card2(farbe, wert);
...
}
```
Das schreibst du einfach um in:

```
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 
	
	
	
	





```
pruefung(Typ.Pik, Wert.Ass)
```
 auf, sondern als 
	
	
	
	





```
pruefung(new Card2(Typ.Pik, Wert.Ass))
```


----------



## Glühwürmchen (5. Jun 2011)

Aaaa~h toll, danke 
Manchma steh ich halt aufm Schlauch xD
Da ist die Lösung doch recht einfach, aber ich komm nich drauf ^^


----------

