# ArrayList vergleichen mit .equals?



## vimar (5. Mrz 2012)

Hallo,

ich muss zwei arraylisten der größe 128 auf gleichheit prüfen.

clust.Centroid und AverageCentroid sind beides ArrayListen <Integer>


```
if (clust.Centroid.equals(AverageCentroid)){
                
                System.out.println("Centroid nicht veraendert!");
            }
            else {
                System.out.println("Centroid muss verändert werden!");
                
                System.out.println("Centroid: " + clust.Centroid.toString());
                System.out.println("Wird ersettzt durch: ");
                System.out.println("AVCentroid: "+ AverageCentroid.toString());
                
                clust.Centroid = AverageCentroid;
                changedCentroid = true;
            }
```

im output "klappts scheinbar manchmal, scheinbar manchmal auch nicht" :

Centroid nicht veraendert!
Centroid nicht veraendert!
Centroid muss verändert werden!
Centroid: [32, 18, 11, 14, 27, 9, 5, 9, 110, 36, 8, 7, 11, 5, 9, 41, 66, 20, 10, 15, 31, 18, 20, 35, 25, 12, 11, 18, 31, 21, 18, 15, 44, 14, 9, 18, 33, 13, 6, 11, 136, 32, 6, 6, 12, 6, 8, 59, 75, 19, 16, 31, 51, 28, 17, 33, 31, 21, 22, 27, 36, 19, 11, 15, 44, 11, 6, 16, 31, 15, 10, 16, 132, 59, 19, 11, 11, 5, 6, 31, 62, 35, 39, 47, 47, 18, 8, 15, 29, 21, 28, 27, 30, 17, 11, 15, 33, 10, 5, 9, 23, 13, 12, 18, 91, 32, 13, 9, 11, 8, 13, 34, 49, 25, 24, 23, 28, 17, 16, 20, 24, 15, 20, 18, 21, 16, 15, 14]
Wird ersettzt durch: 
AVCentroid: [32, 18, 11, 14, 27, 9, 5, 9, 110, 36, 8, 7, 11, 5, 9, 41, 66, 20, 10, 15, 31, 18, 20, 35, 25, 12, 11, 18, 31, 21, 18, 15, 44, 14, 9, 18, 33, 13, 6, 11, 136, 32, 6, 6, 12, 6, 8, 59, 75, 19, 16, 31, 51, 28, 17, 33, 31, 21, 22, 27, 36, 19, 11, 15, 44, 11, 6, 16, 31, 15, 10, 16, 132, 59, 19, 11, 11, 5, 6, 31, 62, 35, 39, 47, 47, 18, 8, 15, 29, 21, 28, 27, 30, 17, 11, 15, 34, 10, 5, 9, 23, 13, 12, 18, 91, 32, 13, 9, 11, 8, 13, 34, 49, 25, 24, 23, 28, 17, 16, 20, 24, 15, 20, 18, 21, 16, 15, 14]
Centroid nicht veraendert!

allerdings sieht man auch dass die "arraylisten" gleichsind aber nicht als gleich gesehen werden! 
eignet sich hier nicht .equals()? vielen dank für jegliche ideen


----------



## Andgalf (5. Mrz 2012)

Nein equals eignet sich hier nicht !!! Equals vergleicht hier nur ob es sich um die gleichen Objekte handelt, überprüft aber nicht ob die Inhalte Listen gleich sind.

btw variablen beginnt man mit Kleinbuchstaben


----------



## vimar (5. Mrz 2012)

biste dir ganz sicher?


----------



## Andgalf (5. Mrz 2012)

jo


----------



## vimar (5. Mrz 2012)

kann es nicht sein dass die referenz verglichen wird?


----------



## Andgalf (5. Mrz 2012)

Ja korrekt .... es wird die Objektidentität(referenz) verglichen. Wenn deine beiden Listen also nicht das exakt gleiche Objekt sind funktioniert das so wie Du das machst nicht.

Wenn Du wissen willst, ob in zwei Listen die gleichen Inhalte sind musst du schon etwas mehr tun als nur mit equals zu vergleichen.


----------



## XHelp (5. Mrz 2012)

Andgalf hat gesagt.:


> überprüft aber nicht ob die Inhalte Listen gleich sind


Veto!
Aus 
	
	
	
	





```
AbstractList
```
:

```
public boolean equals(Object o) {
	if (o == this)
	    return true;
	if (!(o instanceof List))
	    return false;

	ListIterator<E> e1 = listIterator();
	ListIterator e2 = ((List) o).listIterator();
	while(e1.hasNext() && e2.hasNext()) {
	    E o1 = e1.next();
	    Object o2 = e2.next();
	    if (!(o1==null ? o2==null : o1.equals(o2)))
		return false;
	}
	return !(e1.hasNext() || e2.hasNext());
    }
```

Hier ist das Problem, dass die Listen nun mal nicht identisch Sind. Recht weit hinten ist in einer Liste 
	
	
	
	





```
33
```
 und in der anderen 
	
	
	
	





```
34
```


----------



## Gast2 (5. Mrz 2012)

Doch, equals müsste da schon das richtige machen. Die AbstractList implementiert das entsprechend:
AbstractList (Java 2 Platform SE v1.4.2))

Bist du dir sicher, dass da irgendwo mittendrin ne Zahl nicht doch unterschiedlich ist?

EDIT:
Da war XHelp schneller


----------



## Ebenius (5. Mrz 2012)

Andgalf, entweder hab ich was überlesen, oder Du bist ganz arg auf dem Holzweg. So sieht die AbstractList.equals(Object)-Implementierung aus die die java.util.ArrayList erbt:


```
public boolean equals(Object o) {
  if (o == this)
    return true;
  if (!(o instanceof List))
    return false;

  ListIterator<E> e1 = listIterator();
  ListIterator e2 = ((List) o).listIterator();
  while(e1.hasNext() && e2.hasNext()) {
    E o1 = e1.next();
    Object o2 = e2.next();
    if (!(o1==null ? o2==null : o1.equals(o2)))
      return false;
    }
  return !(e1.hasNext() || e2.hasNext());
}
```
Identität prüft man mit [c]==[/c], inhaltliche Gleichheit prüft man mit [c]Object.equals(Object)[/c].

Ebenius


----------



## vimar (5. Mrz 2012)

so sollte es klappen? oder?


```
int n = 0;
            while(n < clust.Centroid.size()){
                
                if(!(clust.Centroid.get(n).equals(AverageCentroid.get(n)))){
                    
                    System.out.println("Centroid muss verändert werden!");
                
                    System.out.println("Centroid: " + clust.Centroid.toString());
                    System.out.println("Wird ersettzt durch: ");
                    System.out.println("AVCentroid: "+ AverageCentroid.toString());
                
                    clust.Centroid = AverageCentroid;
                    changedCentroid = true;
                    break;
                }
                
            }
```


----------



## XHelp (5. Mrz 2012)

Da schon zu viele Posts geschrieben wurden sind hier nochmal:
Die Listen sind nicht gleich:

```
17, 11, 15, [U]34[/U], 10, 5,
```


```
17, 11, 15, [U]33[/U], 10, 5,
```


----------



## vimar (5. Mrz 2012)

hey vielen dank, also lasse ich einfach .equals().  und laufe nicht eigenständig alle elemente ab.


----------



## Andgalf (5. Mrz 2012)

Ebenius hat gesagt.:


> Andgalf, entweder hab ich was überlesen, oder Du bist ganz arg auf dem Holzweg.



Nope ... hier war ich tatsächlich vollständig auf dem Holzweg. Ich wusste nicht, dass AbstractList das equals implementiert. Und wenn das nicht der Fall wäre würde es auf Object.equals zurückgehen und das ist dann das selbe wie == bzw. ObjektIdentität.


Sorry auf jeden Fall für die Fehlinformation meinerseits @Vimar


----------



## Marco13 (5. Mrz 2012)

Die Vehemenz und Nachdrücklichkeit die sich in dem 


Andgalf hat gesagt.:


> jo


auf eine _explizite Nachfrage hin_ (!) widerspiegelt finde ich dann einerseits beeindruckend, andererseits... hm.... das Gegenteil davon, was auch immer das dann ist. 

List#equals ist auch klar so spezifiziert: Zwei Listen sind genau dann gleich, wenn sie die gleichen Elemente in der gleichen Reihenfolge enthalten. (Bei Set#equals müssen es z.B. nur die gleichen Elemente sein, unabhängig von deren Reihenfolge).


----------

