Am verzweifeln mit Java...

Ookami

Braeburn
Registriert
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!
 

gert

Macoun
Registriert
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
 
Zuletzt bearbeitet:

mikescho

Gala
Registriert
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);
 

ifthenelse

Fießers Erstling
Registriert
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
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Noch ein Hinweis: Mit == vergleichst Du, ob es sich um dieselben Objekte handelt. Mit equals prüfst Du, ob es der gleiche Inhalt ist.
 

tfc

Ontario
Registriert
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)

Noch ein Hinweis: Mit == vergleichst Du, ob es sich um dieselben Objekte handelt. Mit equals prüfst Du, ob es der gleiche Inhalt ist.
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.
 
Zuletzt bearbeitet:

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
tfc;1407781Wenn der Compiler es so streng sehen würde wie Du schrieb:
Wenn es der Compiler so streng sähe funktionierte Dein Code nicht? Meinst Du? Dann wäre das auch ein dämlicher Compiler, der einen Objektvergleich bei Primitiven heranzieht ;)

Nein mal im Ernst: Der Klugscheißer hier bin immer noch ich! Vergleiche dazu das Apfeltalk Blog. Wenn es um einen Objektvergleich geht, und darum ging es nun mal, dann komm Du doch nicht mit einem anderen Vergleich an, nur weil es zufällig die gleiche Zeichenfolge ist. "equals" gibt es z.B. für Primitive gar nicht.
 

helge

Leipziger Reinette
Registriert
17.10.06
Beiträge
1.790
ja, genauer: ob beide referenzen auf das selbe objekt zeigen.
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!
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
Bisher habe ich nie verstanden, wieso Java mit der tollen String-Unterstützung (also im Gegensatz zu C) mit .equals() vergleicht, anstatt mit == . Danke!
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.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
[…]
Wie willst Du sonst vergleichen, ob zwei Referenzen auf dasselbe Objekt verweisen?
Ich nehme an, dass du hier dasgleiche meinst.

[…]
Mit Operatorenüberladung wie sie C++ kennt, könnte man das Problem lösen, nur das geht in Java nicht.
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.
 

cyphorious

Braeburn
Registriert
11.05.08
Beiträge
46
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.

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.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
Man nennt es nicht Zeiger, weil es eben eine Referenz ist.
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.
 

tfc

Ontario
Registriert
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.
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
;) Apropos Zeiger vs. Referenz:
Referenz (reference): Bezug auf ein Objekt, implementiert als Adresse des Objekts. Eine Referenzvariable speichert die Adresse eines Objekts. Der Adresswert null zeigt an, dass kein gültiger Adresswert gespeichert ist.
C++ kennt zwei Arten der Adressverwaltung, die C++-Referenzen und die C++-Pointer. Die Java-Referenzen ähneln von der Sprachsyntax her den C++-Referenzen, sind aber in der Implementation identisch mit den C++-Pointern.
In Java muss man jedes Objekt mit new erzeugen, und seine Adresse auf einer Referenzvariablen speichern, wenn man es später noch benutzen will. Mit einer Variablendeklaration der Form Objekttyp variablenname hat man stets nur eine Referenzvariable, es gibt keine "direkten Objektvariablen".
[Quelle…]
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
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.
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.
 
Zuletzt bearbeitet:

zweiundvierzig

Horneburger Pfannkuchenapfel
Registriert
25.01.07
Beiträge
1.420
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 =)]