Java Simple Aufgabe Wort auf Palindrom überprüfen klappt nicht siehe Foto?

pkelodj  30.11.2022, 14:08

Hallo, was war die Lösung endlich? Ich kriege immer bei String mit leerzeichen fehler.

Nichtsnutz12 
Fragesteller
 30.11.2022, 14:54

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.

pkelodj  01.12.2022, 05:34

Danke sehr. Hast du noch Übungen für diese vorlesung bei dir, damit ich üben kann, oder Probeklausur usw. auch?

Nichtsnutz12 
Fragesteller
 01.12.2022, 14:00

Geh auf die Codingbat Webseite. Da hab ich die ganzen Übungen her, hat uns unser Dozent empfohlen dort zu üben.

pkelodj  15.01.2023, 11:52

Alles gut. War einen Fehler.

pkelodj  10.02.2023, 05:21

Hast du vielleicht noch alte Klausuren bei dir?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.
Nichtsnutz12 
Fragesteller
 13.05.2019, 16:11

ok danke oha wie frech ist das denn schau dir diesen Fall an:

https://ibb.co/j8HFHMx

0
ultrarunner  13.05.2019, 16:13
@Nichtsnutz12

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.

1

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

Von Experte JanMarcel01 bestätigt

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;          
}
Woher ich das weiß:Berufserfahrung

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.

Nichtsnutz12 
Fragesteller
 13.05.2019, 16:11

ok danke oha wie frech ist das denn schau dir diesen Fall an:

https://ibb.co/j8HFHMx

0
jort93  13.05.2019, 16:15
@Nichtsnutz12

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.

1
jort93  13.05.2019, 17:34
@AlexByJava

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.

1

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.

Woher ich das weiß:Berufserfahrung – Jahrzehntelange Berufserfahrung
Nichtsnutz12 
Fragesteller
 13.05.2019, 16:10
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

0
mepeisen  13.05.2019, 18:04
@Nichtsnutz12

Du musst nur noch die Leerzeichen aus dem Text entfernen. So etwas geht beispielsweise via regular expressions.

2