1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Am verzweifeln mit Java...

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Ookami, 12.05.08.

  1. Ookami

    Ookami Braeburn

    Dabei seit:
    03.07.07
    Beiträge:
    42
    Hi!

    Ich soll für die Uni in Java ne lustige übung machen wo wir testen sollen ob ein Wort ein palindrom ist. Hört sich einfach an hab ich mir geacht. Denkste. Ich werd noch verrückt... obwohl der Debugger mir anzeigt das beide Variablen das prinzipiell gleiche array enthalten, spuckt mir der vergleich ein false aus.

    Hier der Code:
    Code:
         public static boolean istPalindrom(String s) {
        	s = s.toLowerCase();
        	char[] arrayKopie = s.toCharArray();
        	int laenge = arrayKopie.length;
    		char[] reverse = new char[laenge];
        	for(char i: arrayKopie){
        		laenge-=1;
        		reverse[laenge] = i;
        	}
        	return (arrayKopie == reverse);
        }
    
    Weiß jemand Rat?
    Danke für eure Hilfe und noch einen Schönen Feiertag!
     
  2. gert

    gert Macoun

    Dabei seit:
    19.08.05
    Beiträge:
    118
    hallo,
    ich glaube es hakt am vergleich.
    probier mal folgendes return statement:

    return new String(arrayKopie).equals(new String(reverse));

    du kannst zwei char arrays nicht so vergleichen. genauso verhaelt es sich auch bei string vergleichen: (string1 == string2) != string1.equals(string2)

    wenn du arrays hast, dann vergleiche sie doch ueber die einzelnen elemente.
    natuerlich nur fuer den fall, dass beide arrays die gleiche laenge haben, sonst waeren sie ja eh ungleich.

    beste gruesse,
    .gert
     
    #2 gert, 12.05.08
    Zuletzt bearbeitet: 12.05.08
  3. Ookami

    Ookami Braeburn

    Dabei seit:
    03.07.07
    Beiträge:
    42
    Super! Klappt. Dankeschön!
     
  4. mikescho

    mikescho Gala

    Dabei seit:
    10.08.05
    Beiträge:
    52
    Alternativ könntest Du übrigens auch die statische Methode equals der Klasse Arrays nutzen:
    Code:
    return Arrays.equals(arrayKopie, reverse);
     
  5. ifthenelse

    ifthenelse Fießers Erstling

    Dabei seit:
    07.12.06
    Beiträge:
    129
    Noch ein Tipp: Schau mal ins Wikipedia. Da findest Du einen eleganteren Ansatz, als den gesamten String erst einmal in ein Array zu kopieren, ein Duplikat zu generieren und dieses auch noch zu invertieren. Zumindest die letzen zwei Schritte sind unnötig, wenn Du von vorne rein nur mit dem Array des zu verarbeitenden Strings arbeitest...

    Gruss, Jörg
     
  6. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Noch ein Hinweis: Mit == vergleichst Du, ob es sich um dieselben Objekte handelt. Mit equals prüfst Du, ob es der gleiche Inhalt ist.
     
  7. cyphorious

    cyphorious Braeburn

    Dabei seit:
    11.05.08
    Beiträge:
    46
    ja, genauer: ob beide referenzen auf das selbe objekt zeigen.
     
  8. tfc

    tfc Ontario

    Dabei seit:
    21.07.07
    Beiträge:
    348
    Code:
    public static boolean isPalindrom(String string){
    		if (string.length() < 2)
    			return true;
    		else if (string.charAt(0) == string.charAt(string.length()-1)){
    			return isPalindrom(string.substring(1, string.length()-1));
    		}
    		return false;
    	}
    (hab jetzt den lowercase-Kram nicht drin)

    Wenn der Compiler es so streng sehen würde wie Du, dann würde mein geposteter Code nicht funktionieren.
    Es kommt sehr darauf an, was man da genau vergleicht. int, boolean, char und so weiter kann man direkt mit == vergleichen, weil es ja keine Objekte sind.
     
    #8 tfc, 16.05.08
    Zuletzt bearbeitet: 16.05.08
  9. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
     
  10. cyphorious

    cyphorious Braeburn

    Dabei seit:
    11.05.08
    Beiträge:
    46
    wozu auch... die sind nicht referenziert.
     
  11. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Ich weiß. Ich bin ja auch nicht tfc ;)
     
  12. helge

    helge Dithmarscher Paradiesapfel

    Dabei seit:
    17.10.06
    Beiträge:
    1.466
    Oh, schöne für die Erklärung :) !
    Bisher habe ich nie verstanden, wieso Java mit der tollen String-Unterstützung (also im Gegensatz zu C) mit .equals() vergleicht, anstatt mit == . Danke!
     
  13. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    Java vergleicht nur elementare Typen via "==", eine Referenz (scheußlich warum man das nicht Zeiger wie in jeder anderen Sprache nennt) ist so ein elementarer Typ. Sowohl das Kopieren wie auch das Vergleichen ist in Java "flach", d.h. man muß eine spezielle Methode verwenden, wenn man "tiefe" Kopien will. Das ist nur konsequent.

    Wie willst Du sonst vergleichen, ob zwei Referenzen auf dasselbe Objekt verweisen? Mit Operatorenüberladung wie sie C++ kennt, könnte man das Problem lösen, nur das geht in Java nicht.
     
  14. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ich nehme an, dass du hier dasgleiche meinst.

    Nein, mit Operator-Overloading kann man das Problem nicht lösen, auch nicht in C++.

    Wenn man einen Zeiger auf ein Objekt hat, stellt sich schon gedanklich die Frage, was ich vergleichen möchte. Wenn ich == auf Zeiger verwende, ist es eine logische Frage, ob ich Identität oder Gleichheit meine. Wie auch immer der Compiler das interpretiert, wie auch immer das überladen ist, stellt sich die Frage, ob ich Identität oder Gleichheit meine. Ich muss mich daher stets festlegen.

    Da es sich um Zeiger handelt, ist es nahe liegend, dass Zeiger verglichen werden, also Identität gemeint ist. Alles andere wäre mindestens verwirrend, würde aber in jedem Falle den Test auf Identität vermeiden.

    Es ist ein Irrglaube zu meinen, man könne mit technischen Tricks ein logisches Problem wegdefinieren. Das Ergebnis ist wie so oft bei C++ nur Verwirrung anstatt Vereinfachung. Es ist daher richtig, dies klarzustellen und eine Methode equals(), isEqual() oder ähnliches zu haben.

    Fehlerhaftes Operator-Overloading dürfte nach Templates auf der Liste der beliebtesten Fehler unmittelbar auf Platz 2 folgen.
     
  15. cyphorious

    cyphorious Braeburn

    Dabei seit:
    11.05.08
    Beiträge:
    46
    Man nennt es nicht Zeiger, weil es eben eine Referenz ist. Die gibts es übrigens auch in C coexistent zu Zeigern.
    Eine Referenz ist kein elementarer Datentyp, weil Referenzen keine Datentypen sind. Man kann referenzen auf elementare Datentypen (in java eher selten) oder auf komplexe Datentypen haben.
     
  16. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    Das stimmt so nicht, denn Java Referenzen folgen der Semantik von Zeigern aus anderen Programmiersprache z.B. Pascal. Nur Zeigerarithmetik ist nicht möglich, aber diese Eigenschaft teilt Java mit Pascal und vielen anderen Sprachen.
     
  17. tfc

    tfc Ontario

    Dabei seit:
    21.07.07
    Beiträge:
    348
    Zeigerarithmetik wurde von den Java-Entwicklern bewusst ausgelassen, weil es viel sicherer sein soll, da man so nicht mehr in fremden Speicherbereichen herumhüpfen könne.
     
  18. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    ;) Apropos Zeiger vs. Referenz:
    [Quelle…]
     
  19. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    Es ist sicherer auf Zeigerarithmetik zu verzichten, daß heißt zwar nicht, daß es keine Probleme mehr mit Zeigern gibt, aber die übelsten Fehler kann man so verhindern.
     
    #19 tjp, 21.05.08
    Zuletzt bearbeitet: 21.05.08
  20. zweiundvierzig

    zweiundvierzig Horneburger Pfannkuchenapfel

    Dabei seit:
    25.01.07
    Beiträge:
    1.419
    wenn ich mir die reichhaltigen Hilfestellungen hier anschau bereue ich es, dass ich nicht schon früher geswitcht bin und die Vorteile einer funktionierenden Gemeinde wie hier genutzt habe...

    so wäre mir die Schmach der versemmelten Informatik II-Prüfung im dritten Semester erspart geblieben =)

    [habs letztendlich aber doch geschafft =)]
     

Diese Seite empfehlen