ArrayList vergleichen mit .equals?

vimar

Bekanntes Mitglied
Hallo,

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

clust.Centroid und AverageCentroid sind beides ArrayListen <Integer>

Java:
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
 
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
 
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.
 
überprüft aber nicht ob die Inhalte Listen gleich sind
Veto!
Aus
Code:
AbstractList
:
Java:
    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
Code:
33
und in der anderen
Code:
34
 
Zuletzt bearbeitet:
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:

Java:
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
 
so sollte es klappen? oder?

Java:
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;
                }
                
            }
 
Da schon zu viele Posts geschrieben wurden sind hier nochmal:
Die Listen sind nicht gleich:
Code:
17, 11, 15, [U]34[/U], 10, 5,
Code:
17, 11, 15, [U]33[/U], 10, 5,
 
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
 
Die Vehemenz und Nachdrücklichkeit die sich in dem
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).
 

Zurück
Oben