# ArrayList contains()-Methode



## kwonilchang (28. Feb 2008)

Hallo!

Habe eine ArrayList implementiert, in die nacheinander vom Benutzer Werte eingegeben werden. Bevor die jeweiligen Werte der ArrayList hinzugefügt werden (hier habe ich die .add()-Methode verwendet), soll aber überprüft werden, ob der Wert bereits in der Liste enthalten ist. Das wollte ich einfach mit der .contains()-Methode abprüfen. 

Beim Durchlauf des Programms wird mir zwar seitens des Compilers keine Fehlermeldung angezeigt, aber sobald ich einen Wert doppelt eingebe, wird auch keine  Fehlermeldung angezeigt, sonder der Wert nochmals in die Liste mitaufgenommen.

Muss man für die contains()-Methode irgendeine bestimmte Zusatzmethode basteln? Hatte schon versucht eine compareTo()- und equals()-Methode für die Werte zu definieren, das nützt aber auch nichts.

Danke schonmal,

kwonilchang


----------



## SlaterB (28. Feb 2008)

du musst die equals()-Methode für die Werte definieren


----------



## maki (28. Feb 2008)

und auch die hashcode() Mehode


----------



## kwonilchang (29. Feb 2008)

Danke für eure Hinweise. Bin immer noch nicht weitergekommen   ...

Wie schon geschrieben, habe ich eine ArrayList, in die Punkte gespeichert werden. Bevor ein Punkt in diese Liste eingefügt wird, soll überprüft werden, ob dieser Punkt schon in der Liste enthalten ist. Hierfür hab ich folgendes in der entsprechenden Methode:


```
if (points.contains(p) == true){
			System.out.println ("Error! Punkt bereits enthalten!");
		}else{
			this.points.add(p);
		}
```

In der Klasse für die Punkte habe ich eine compareTo- und eine equals-Methode eingefügt:


```
public int compareTo (Point p){
		int ergebnis = 0;
		
		if (this.x < p.x){
			ergebnis = -1;
		}
		if (this.x > p.x){
			ergebnis = 1;
		}
		if (this.x == p.x){
			if (this.y < p.y){
				ergebnis = -1;
			}else if (this.y > p.y){
				ergebnis = 1;
			}else {
				ergebnis = 0;
			}
		}
		
		return ergebnis;
	}
```


```
public boolean equals (Point p){
		boolean erg = true;
		if (p != null){
			if (this.x == p.x && this.y == p.y){
				erg = true;
			}else{
				erg = false;
			}
		}
		return erg;
	}
```

Lasse ich das Programm laufen, funktioniert alles prima, solange ich keine gleichen Punkte eingebe.

Sobald ich einen Punkt eingebe, der schon in der Liste enthalten ist, wird bei der Ausgabe am Ende des Programms nur mehr eine Liste ausgeben, die die beiden identischen Punkte enthält. Hier sollen aber alle Punkte ausgegeben werden, die ich eingegeben habe ???:L .

maki hatte geschrieben, dass ich eine hashcode()-Methode definieren muss. Brauche ich die wirklich? Ich habe ja keine Hashmap.

Weiß jemand Rat?


----------



## maki (29. Feb 2008)

Von deinen anderen Problemen abgesehen, willst du wirklich das equals true zurückgibt wenn p == null ist?


----------



## SlaterB (29. Feb 2008)

> public boolean equals (Point p){ 

ist deine persönliche zwecklose Spass-Operation

ArrayList ruft aber
public boolean equals (Object o) {

}
auf, die hast du noch nicht implementiert

schreibe zum testen 
System.out.println("Aufruf");
rein,
diese Ausgabe sollte dann einige Male erscheinen, wenn es funktioniert


----------



## kwonilchang (29. Feb 2008)

@ SlaterB: Danke für den Tipp.

Also eine neue equals-Methode:


```
public boolean equals (Object obj){
		boolean erg;
				
		if (this == obj){
			erg = true;
		}else{
			erg = false;
		}
			return erg;
	}
```

Hab die Abfrage mit contains auch mal geändert:


```
if (points.contains(p) == true){
			System.out.println ("Error! Punkt bereits enthalten!");
		}else{
			System.out.println ("Aufruf");
			//this.points.add(p);
		}
```

Nun passiert folgendes:

Nach jedem Punkt, den ich eingebe, wird mir Aufruf angezeigt. Auch wenn ich einen Punkt zweimal eingebe  :cry: 

Stimmt da was an der contains-Methode nicht?


----------



## SlaterB (29. Feb 2008)

> Stimmt da was an der contains-Methode nicht?

nein

--------

 vorher hattest du eine equals-Operation, die die x und y-Werte vergleich,
nun prüfst du nur noch, ob es dasselbe Objekt ist,
das ist sinnlos, denn das macht die Standard-equals-Operation auch schon

was fügst du denn nun ein, ein und dasselbe Objekt 2x hintereinander
oder zwei unterschiedliche Objekte mit gleichen x und y?


----------



## kwonilchang (29. Feb 2008)

Also eingefügt werden die x- und y-Koordinaten der Punkte als Integer. Deshalb hatte ich vorher in der equals-Methode auch die x- und y-Koordinaten verglichen.

Dieser Koordinaten werden als ein Punktobjekt in der ArrayList abgespeichert. Wird nun ein Punkt eingegeben, der die selbe x- und y-Koordinate hat wie ein Punkt aus der Liste, dann soll eine entsprechende Fehlermeldung ausgegeben werden. 

Aus diesem Grund hatte ich in der neuen equals-Methode dann nur überprüft, ob die Objekte an sich gleich sind.


----------



## SlaterB (29. Feb 2008)

ich gebe auf


```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        {
            MyPoint a = new MyPoint(1, 0);
            MyPoint b = new MyPoint(1, 0);

            List list = new ArrayList();
            list.add(a);
            System.out.println(list.contains(a)); // Test mit denselben Punkt
            System.out.println(list.contains(b)); // Test mit gleichenPunkt
        }
        System.out.println("--------------");
        {
            MyPoint2 a2 = new MyPoint2(1, 0);
            MyPoint2 b2 = new MyPoint2(1, 0);

            List list2 = new ArrayList();
            list2.add(a2);
            System.out.println(list2.contains(a2)); // Test mit denselben Punkt
            System.out.println(list2.contains(b2)); // Test mit gleichenPunkt
        }
    }
}


class MyPoint
{
    private int x;
    private int y;

    public MyPoint(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    // könnte auch weggelassen werden, Standard-Fall
    public boolean equals(Object obj)
    {
        return this == obj;
    }
}


class MyPoint2
{
    private int x;
    private int y;

    public MyPoint2(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public boolean equals(Object obj)
    {
        MyPoint2 other = (MyPoint2)obj;
        return this.x == other.x && this.y == other.y;
    }
}
```


----------



## kwonilchang (29. Feb 2008)

Danke, damit kann ich aber auch leider nichts anfangen. Lass mir jetzt grad anzeigen, ob der Punkt in der Liste ist, aber egal was ich mache, es kommt immer false raus. Lösche jetzt einfach mal alles und fang nochmal ganz von vorn an.


----------

