inhomogene Listenelemente vergleichen
-
Ich habe eine inhomogene, doppeltverkettete Liste.
Folgende Methode arbeitet nicht korrekt, da die if Anweisung nicht so arbytet, wie sie soll, in der markierten Zeilepublic List removeLast(Object o, int n) { List l = new PList(); for(ListElement it=last; n > 0 && it!=null; it=it.previous) if(it.elem==o) // *MARKIER* { l.append(it); // it wird nun geloescht. das nachfolgende element zeigt nun auf it's vordermann it.next.previous=it.previous; System.out.println("jetzt"); --n; } else System.out.println("it.elem ist "+it.elem.toString()+" und das ist ganz sicher nicht " +o); return l; }
Folgende Ausgabe wird beim executen erzeugt:
it.elem ist Hello World und das ist ganz sicher nicht 2 it.elem ist 2 und das ist ganz sicher nicht 2 it.elem ist 5 und das ist ganz sicher nicht 2 it.elem ist 4 und das ist ganz sicher nicht 2 it.elem ist 3 und das ist ganz sicher nicht 2 it.elem ist 2 und das ist ganz sicher nicht 2 it.elem ist 1 und das ist ganz sicher nicht 2 it.elem ist 0 und das ist ganz sicher nicht 2
Warum ergibt folgender Vergleich
if(it.elem==o)
nicht dass, was ich will(naemlich, dass 2==2 ist und nicht, wie jetzt 2!=2)?
-
du musst die objekte mit equals(...) vergelichen
if( bla.equals( other ) ) { ... }
-
warum geht das nicht mit dem operator== ?
-
Da nur Referenzen auf gleichheit überprüft werden und nicht die Werte.
Stichwort Call By Ref and Call by Val.
-
aber die referenzen werden doch automatisch dereferenziert.
-
Raptor schrieb:
aber die referenzen werden doch automatisch dereferenziert.
== testet aber auf 'identität' während equals auf gleichheit prüft.
Es ist natürlich wäre es schöner == statt equals verwenden zu können, aber das ganze hat auch wieder den Vorteil, dass du recht gut auf identität prüfen kannst.
Wenn == auf gleichheit prüfen würde, hättest du ein Problem. Denn da Java keine Operatoren Überladung kann, könntest du keinen eigenen operator== implementieren. Das wäre doof.
Auch sind nicht alle Objekte auf gleichheit vergleichbar, jedoch ist jedes auf identität prüfbar.
-
Shade Of Mine schrieb:
Denn da Java keine Operatoren Überladung kann, könntest du keinen eigenen operator== implementieren.
Operatorenüberladung gibt es zum Glück _nicht_ in Java.
-
Java_is_cool schrieb:
Operatorenüberladung gibt es zum Glück _nicht_ in Java.
flames sind uncool
-
@Shade & all: Koenntest du/ihr bitte in dem Zusammenhang noch einmal den Unterschied zwischen Identitaet und Gleichheit erlaeutern?
Dankebtw:
Operatorenüberladung gibt es zum Glück _nicht_ in Java.
aaargh - bitte das in einem anderen thread ausflamen und diesen nicht kaputtmachen
-
Shade Of Mine schrieb:
Raptor schrieb:
aber die referenzen werden doch automatisch dereferenziert.
== testet aber auf 'identität' während equals auf gleichheit prüft.
bitte definiere gleichheit(evtl. identitaet gleich mit, weils so schoen ist ;)).
-
Hi Raptor:
string s1 = "Hallo"; string s2 = "Hallo"; // s1 = s2; if(s1 == s2) Console.Writeln("Gleiche Referenz"); if(s1.equals(s2)) Console.Writeln("Gleicher Inhalt"); else Console.Writeln("Völlig anders");
Das liefert z.B. 'Gleicher Inhalt', da s1 und s2 ja auf unterschiedlichen
Speicher zeigen. Machst du den Kommentar weg, läuft's in 'Gleiche Referenz'.Jockel
-
*klick*
danke