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 Zeile

    public 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?
    Danke 🙂

    btw:

    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 🙂


Anmelden zum Antworten