Java Simple Aufgabe Wort auf Palindrom überprüfen klappt nicht siehe Foto?
Hallo, was war die Lösung endlich? Ich kriege immer bei String mit leerzeichen fehler.
Keine Ahnung ist lange her. Versuchs mal nicht mit Char sondern mit dieser einen anderen Methode.
Tipp: schau dir die Antworten an, da sind einige Lösungen.
Danke sehr. Hast du noch Übungen für diese vorlesung bei dir, damit ich üben kann, oder Probeklausur usw. auch?
Geh auf die Codingbat Webseite. Da hab ich die ganzen Übungen her, hat uns unser Dozent empfohlen dort zu üben.
.nmhjk
? 😧
Alles gut. War einen Fehler.
ok
Hast du vielleicht noch alte Klausuren bei dir?
Nein 👎
7 Antworten
Deine Schleife hat zwei Probleme:
- Der Startwert sollte um eins niedriger sein (die Zeichenzählung beginnt bei 0).
- Die Bedingung sollte i >= 0 lauten, und nicht i == 0.
Naja, "er hortet rohre" ist nur dann ein Palindrom, wenn man die Leerzeichen unberücksichtigt lässt. Wenn das so gewünscht ist, musst du die Leerzeichen aus dem String entfernen.
Brauchst keinen zweiten String erzeugen.
bool isPalindrome = true;
for (int i = 0; i < x.length && isPalindrome; i++)
{
isPalindrome = x[i] == x[x.length - i - 1];
}
return isPalindrome;
Und der Code macht noch zu viel - Du müsstest eigentlich nur über den halben String laufen (aber da müsste man zwischen geraden und ungeraden Längen unterscheiden).
Was macht der Code? Er vergleicht das erste und das letzte Zeichen, dann das zweite mit dem vorletzten, das dritte mit dem vorvorletzten, etc. Wenn es ein Palindrom ist, dann müssen die gleich sein.
Die Schleife läuft so lang, bist der ganze String verglichen wurde oder bereits festgestellt wurde, dass es kein Palindrom ist. Wie gesagt, eigentlich könntest Du bei der Hälfte des Strings schon aufhören, aber das überlasse ich Dir als Übung :-D
Ich habe dazu vor einigen Wochen bereits eine Lösung vorgeschlagen, die aus meiner Sicht recht elegant ist:
public static boolean isPalindrome(String x) {
x = x.toLowerCase();
for (int i = 0; i < x.length()/2; ++i)
if (x.charAt(i) != x.charAt(x.length()-1-i))
return false;
return true;
}
Hä, was tust du denn da?
Die Bedingung für deinen for loop ist i == 0, was ein Quatsch. Wenn du nen for loop hast mit nem == in der Bedingung läuft irgendwas ganz falsch.
Außerdem, x.CharAt(x.length) geht nicht. Ein String der Länge n geht ja nur bis n-1.
ok danke oha wie frech ist das denn schau dir diesen Fall an:
Na ganz einfach, dein programm kopiert (und überprüft) auch leerzeichen mit. Das scheint aber nicht gewollt zu sein. Denn beispielsweise "er hor" soll ja das gleiche sein wie "erhor" wenn du dir den fall anschaust der bei dir falsch ist.
Ich denke dein ansatz funktioniert nicht gut bei der anforderung. Aber ein einfacher, schneller fix wäre mit replaceAll einfach alle leerzeichen aus beiden strings rauszulöschen mit regex.
Nein, das funktioniert nicht in diesem fall. Das entfernt ja nur leerzeichen am ende und am anfang. Es müssen aber auch leerzeichen in der mitte entfernt werden, daher muss man mit replaceAll arbeiten und nicht mit trim.
Kleiner Tip: charAt zählt von 0 an. Das erste Zeichen ist also 0 und nicht 1, wie du annimmst.
Zudem musst du im zweiten Teil des For die Schleifen-Bedingung definieren. i==0 ist dabei logisch falsch.
TestErwartetErhaltenSystem.out.println(istPalindrom("abc"));
false
false
System.out.println(istPalindrom("ein golf flog nie"));
true
true
System.out.println(istPalindrom("otto"));
true
true
System.out.println(istPalindrom("er hortet rohre"));
true
false
System.out.println(istPalindrom("Anna"));
false
false
System.out.println(istPalindrom("anna"));
true
true
Du musst nur noch die Leerzeichen aus dem Text entfernen. So etwas geht beispielsweise via regular expressions.
ok danke oha wie frech ist das denn schau dir diesen Fall an:
https://ibb.co/j8HFHMx