Palindrom ermitteln

Hallo1234

Bekanntes Mitglied
Hallo,
wie schaffte ich es, auf die letzte Stelle eines Wortes zu zugreifen, um überprüfen zu können, ob es ein Palindrom ist?
Hier ist mein Ansatz bisher:
Java:
public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        String wort = s.next();
        
        for(int i=1; i<wort.length(); i++) {
        if(wort.charAt(0)==wort.charAt(i)) {
            System.out.println("test");
        }
        }
        
        return wort;
    }

Der Code ist offensichtlich noch nicht fertig. Könnte mir jemand dazu einen Tipp geben?
Vielen Dank
 

mihe7

Top Contributor
Du hast doch schon charAt und Du weißt, wie man die Länge des Worts ermittelt. Damit sollte doch klar sein, wie Du auf den letzten Buchstaben des Wortes zugreifen kannst, oder?
 

Hallo1234

Bekanntes Mitglied
Ja, stimmt.
Java:
if(wort.charAt(0)==wort.charAt(wort.length()-1)) {
            System.out.println("test");
        }

Habs jetzt, danke. Geht sogar ohne for-Schleife :)
 

Hallo1234

Bekanntes Mitglied
Okay, jetzt habe ich doch noch eine Frage.
Der Code funktionierte. Als ich dann den Boolean eingesetzt habe, damit der Satz nicht immer 5 Mal durch die for-Schleife ausgegeben wird, wurde plötzlich für jedes Wort der Satz ausgegeben, auch wenn es kein Palindrom ist. Woran liegt das? Ich verstehe es nicht.
Java:
    public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        boolean isPal = false;
        
        String wort = s.next();
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(i)==wort.charAt(wort.length()-(i+1))) {
                isPal = true;
        }
    }
        if(isPal == true) {
            System.out.println("Das Wort "+ wort +" ist ein Palindrom.");
        }
        
        return wort;
    }

Vielen Dank
 

mihe7

Top Contributor
Ja, das erste und das letzte Zeichen geht ohne Schleife. Um festzustellen, ob ein Wort ein Palindrom ist, wirst Du um eine Wiederholung nicht herumkommen.
 

Hallo1234

Bekanntes Mitglied
So müsste es doch eigentich funktionieren oder?
Wo liegt der Fehler?
Java:
public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
      
        System.out.println("Geben Sie ein Wort ein: ");
      
        boolean isPal = false;
      
        String wort = s.next();
      
        int laenge = wort.length();
      
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(wort.length()-(laenge+i))==wort.charAt(wort.length()-(i+1))) {
                //isPal = true;
                System.out.println("Es ist Pal");
        }
    }
        /*if(isPal == true) {
            System.out.println("Das Wort "+ wort +" ist ein Palindrom.");
        }*/
      
        return wort;
    }
Nachtrag: mir ist jetzt auch aufgefallen, dass es so nicht funktionieren kann. Sobald zwei Buchstaben im Wort gleich sind, wird er den Satz ausgeben. Wie schaffe ich es, dass alle Buchstaben überprüft werden?

Nachtrag1: mit else if funktioniert es. Nun bekomme ich aber eine Fehlermeldung: outOfBounds.
Java:
    public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        boolean isPal = false;
        
        String wort = s.next();
        
        int laenge = wort.length();
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(wort.length()-(laenge+i))==wort.charAt(wort.length()-(i+1))) {
                //isPal = true;
                System.out.println("Es ist Pal");
        }else if(wort.charAt(wort.length()-(laenge+i))!=wort.charAt(wort.length()-(i+1))) {
            System.out.println("Kein Pal");
        }
    }
        /*if(isPal == true) {
            System.out.println("Das Wort "+ wort +" ist ein Palindrom.");
        }*/
        
        return wort;
    }
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Nein, nein, der Code in #4 war schon gar nicht sooo verkehrt. Du musst nur die Logik umdrehen: ein Wort ist so lange ein Palindrom, so lange von vorne und hinten gesehen (in jeder Iteration) die gleichen Buchstaben stehen. Sobald einmal ein Unterschied auftritt, ist es kein Palindrom mehr. Klar?
 

123neu

Bekanntes Mitglied
Java:
    public static boolean palindrom(String s) {
        for (int x = 0, y = s.length() - 1; x < y; x++, y--) {
            if (s.charAt(x) != s.charAt(y)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("Gib nen Wort ein, das auf Palindrome hin untersucht wird:");
            String s = scanner.nextLine();
            if (s == null || s.isBlank()) {
                return;
            }
            System.out.println(palindrom(s));
        }
    }
 

Hallo1234

Bekanntes Mitglied
Danke für eure Hilfe. Ich glaube, ich habs jetzt.
Java:
    public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        boolean isPal = false;
        
        String wort = s.next();
        
        int laenge = wort.length();
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(i)!=wort.charAt(wort.length()-(i+1))) {
                isPal = false;
                }else {
                    isPal = true;
            }
    }
        if(isPal == false) {
            System.out.println("Das Wort '"+ wort +"' ist kein Palindrom.");
    }else if(isPal == true) {
        System.out.println("Das Wort '"+wort +"' ist ein Palindrom.");
    }
        return wort;
}
 
K

kneitzel

Gast
Bei so Aufgaben ist das Pattern immer gleich:
a) Sinnvollen Anfangszustand setzen
b) dann alles testen und ggf. Zustand umsetzen. (Optional Schleife noch verlassen)

Dabei wird der Zustand und die Bedingung so gewählt, dass eine Abweichung ausreichend. Ein Palindrom liegt nicht vor, wenn eine zu prüfenden Kombination nicht gleich ist.

Sowas ist generell am einfachsten in eine separaten Methode zu testen. Dann hast du nur die Schleife und wenn die Bedingung zutrifft, dann gibst du direkt das Ergebnis zurück. Ansonsten kommt nach der Schleife die Rückgabe. (Siehe #9)

Es ist bei diesem Pattern immer falsch, den Status immer zu setzen - dabei hast du ja nur noch den letzten check, denn das Ergebnis wird ja immer überschrieben ...

Bezüglich des Algorithmus hier bedeutet das z.B.:
Du gehst davon aus, dass ein Wort ein Palindrom ist. Dann prüfst du die Paare und wenn ein Paar nicht passt, dann änderst du das Ergebnis auf: kein Palindrom.
 

Hallo1234

Bekanntes Mitglied
Vielen Dank für eure Hilfe und Bemühungen, aber ich komme einfach nicht drauf.
Den Fehler habe ich erkannt, sobald der erste und letzte Buchstabe gleich sind, ist isPal true, allerdings habe ich keine Ahnung, wie das zu beheben ist. So sieht es bis jetzt aus:
Java:
public static String findePalindrome() {
        Scanner s = new Scanner(System.in);

        System.out.println("Geben Sie ein Wort ein: ");

        boolean isPal = false;
        
        String wort = s.next();

        isPal = pruefePal(isPal, wort);

        if(isPal == false) {
            System.out.println("Das Wort '"+ wort +"' ist kein Palindrom.");
        }else if(isPal == true) {
            System.out.println("Das Wort '"+wort +"' ist ein Palindrom.");
        }
        return wort;
    }

    public static boolean pruefePal(boolean isPal, String wort) {
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(0)==wort.charAt(wort.length()-(i+1))) {
                isPal = true;
            }else if (wort.charAt(i)!=wort.charAt(wort.length()-(i+1))){
                isPal = false;
            }
        }
        return isPal;
    }
 

mihe7

Top Contributor
Fangen wir nochmal von vorne an: ein Palindrom ist hier ein Wort, das von vorne und hinten gelesen den gleichen Text ergibt.

Wir gehen erstmal davon aus, dass ein gegebenes Wort ein Palindrom ist und zwar bis das Gegenteil bewiesen ist. Jetzt versuchen wir, das Gegenteil zu beweisen, indem wir mit einer Schleife über die Buchstaben iterieren. Da wir in jeder Iteration einen Buchstaben aus der "linken" Hälfte und einen Buchstaben aus der "rechten" Hälfte miteinander vergleichen, brauchen (und sollten) wir den Index nur bis zur Mitte des Worts laufen zu lassen. Außerdem können und müssen wir die Iteration abbrechen, sobald bei einem Vergleich ein Unterschied festgestellt wurde, denn dann befinden wir uns an der Stelle im Wort, an der bewiesen ist, dass das Wort kein Palindrom ist.

Den Abbruch der Schleife können wir unterschiedlich erledigen: bei einer Methode, die ein boolean zurückgibt, können wir einfach per return false aus der Methode zurückkehren. Ansonsten gibt es natürlich die Möglichkeit, per break; die Schleife abzubrechen. Außerdem ließe sich mit einer boolean-Variable und einer geeigneten Schleifenbedingung die Schleife gewöhnlich terminieren.

Möglichkeit mit return:
Java:
    public static boolean pruefePal(String wort) {
        int n = wort.length() / 2;
        for(int i=0; i<n; i++) {
            if(wort.charAt(i) != wort.charAt(wort.length()-(i+1))) {
                return false;
            }
        }
        return true;
    }

Möglichkeit mit break:
Java:
    public static boolean pruefePal(String wort) {
        boolean result = true;
        int n = wort.length() / 2;
        for(int i=0; i<n; i++) {
            if(wort.charAt(i) != wort.charAt(wort.length()-(i+1))) {
                result = false;
                break;
            }
        }
        return result;
    }

Möglichkeit über die Schleifenbedingung:
Java:
    public static boolean pruefePal(String wort) {
        boolean palindromeSoFar = true;
        int n = wort.length() / 2;
        for(int i=0; palindromeSoFar && i<n; i++) {
            palindromeSoFar = (wort.charAt(i) == wort.charAt(wort.length() - 1 - i));
        }
        return palindromeSoFar;
    }

Aufgabe für Dich: versuche, die Codes zu verstehen und an den Wortlängen 4 und 5 nachzuvollziehen, warum n/2 ok ist.
 

Hallo1234

Bekanntes Mitglied
Super, jetzt funktioniert es. Das n/2 bildet so zu sagen eine Trennwand bei der Hälfte des Wortes. So wird die eine Hälfte mit der anderen abgeglichen und es wird true oder false ausgegeben, je nachdem ob die Buchstaben gleich sind. Außerdem unterscheidet man so zwischen gerader und ungerader Wortlänge. Falls ein Wort 5 Buchstaben hat, ist es trotzdem nur nötig, bis zum 2 Buchstaben zu prüfen, weil der mittlere keinen "Partner" hat. War das soweit korrekt?
Ich danke Dir für die ausführliche Erklärung :)
 

mihe7

Top Contributor
Ja, vollkommen richtig. Schau Dir auch die kleinen aber feinen Unterschiede zu Deinem Code an; wichtig wäre, dass Du (für Dich) die Gedankenfehler erkennst.
 

Hallo1234

Bekanntes Mitglied
Juhu, danke. Ja, daran muss ich arbeiten. Am besten schreibe ich hinter jede Zeile einen Kommentar, den die Funktion des Codes beschreibt, dann wird es klarer.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Größtes Palindrom Produkt aus zwei dreistelligen Zahlen Java Basics - Anfänger-Themen 60
A Palindrom Java Basics - Anfänger-Themen 3
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
N palindrom erkennen Java Basics - Anfänger-Themen 3
H Harshad-Zahl (Nivenzahl) und Palindrom überprüfen Java Basics - Anfänger-Themen 2
L Palindrom in zweidimensionalem Array Java Basics - Anfänger-Themen 16
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
T Auf Palindrom überprüfen Java Basics - Anfänger-Themen 10
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
L In Javakara Palindrom erkennen. Java Basics - Anfänger-Themen 9
P Programm Hilfe Palindrom Java Basics - Anfänger-Themen 6
C Bei der LinkedList auf Palindrom überprüfen Java Basics - Anfänger-Themen 4
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
C Palindrom im array Java Basics - Anfänger-Themen 5
R Palindrom eines int-Arrays berechnen Java Basics - Anfänger-Themen 14
D Palindrom Java Basics - Anfänger-Themen 15
H Palindrom Programm Java Basics - Anfänger-Themen 8
K Palindrom Test Java Basics - Anfänger-Themen 9
C Überprüfen auf Palindrom Java Basics - Anfänger-Themen 12
P Palindrom Java Basics - Anfänger-Themen 10
R In einem Palindrom 2 Buchstaben vergleichen Java Basics - Anfänger-Themen 16
H Palindrom Java Basics - Anfänger-Themen 7
NoXiD Auf Palindrom Prüfen Java Basics - Anfänger-Themen 9
M Palindrom mit Groß & kleinbuchstaben Java Basics - Anfänger-Themen 19
M Palindrom Test mit Char-arrays! Java Basics - Anfänger-Themen 3
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
S Bildgröße ermitteln & setSize() übergeben Java Basics - Anfänger-Themen 6
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
R Hangman-Spiel-zufälliges Wort ermitteln Java Basics - Anfänger-Themen 4
H Häufigkeit von Zahlen ermitteln Java Basics - Anfänger-Themen 23
J Datum ermitteln ? Java Basics - Anfänger-Themen 14
M Beliebtesten Film ermitteln Java Basics - Anfänger-Themen 6
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
H Bei forEach Index des Elements ermitteln Java Basics - Anfänger-Themen 17
B DHCP-Server Adresse ermitteln Java Basics - Anfänger-Themen 4
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
J Ein Wort aus einer Datei zufällig ermitteln Java Basics - Anfänger-Themen 3
V Erste Schritte Potenzen b^n mittels Schleife ermitteln Java Basics - Anfänger-Themen 7
B Anzahl von Stunden / Tage von zwei Datumswerten ermitteln Java Basics - Anfänger-Themen 1
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
O 2 Maximalwerte und Minimalwerte aus Array ermitteln Java Basics - Anfänger-Themen 9
L Fortschritt ermitteln Java Basics - Anfänger-Themen 18
N Erste Schritte HSV color space - schwarz und weiß nur anhand von Saturation oder Multiplikator ermitteln Java Basics - Anfänger-Themen 14
N Wahrscheinlichkeiten ermitteln Java Basics - Anfänger-Themen 2
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
J Schwierigkeitsgrad eines Wortes mit Morsecode ermitteln Java Basics - Anfänger-Themen 18
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
M Erste Schritte primzahlen ermitteln, nur zahlen als eingabe erlauben Java Basics - Anfänger-Themen 34
G Größten und kleinsten Wert im Array ermitteln? Java Basics - Anfänger-Themen 7
G Wie kann ich diesen Wert ermitteln? Java Basics - Anfänger-Themen 4
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
D Maximale Teilsumme ermitteln Java Basics - Anfänger-Themen 6
MiMa Jüngstes Datum ermitteln Java Basics - Anfänger-Themen 4
S Compiler-Fehler im array Maximum ermitteln Java Basics - Anfänger-Themen 6
V Querprodukt ermitteln Java Basics - Anfänger-Themen 6
L Array: Summe aller geraden und ungeraden Zahlen ermitteln Java Basics - Anfänger-Themen 9
Joew0815 Int to string und primzahle ermitteln Java Basics - Anfänger-Themen 2
F Jalousie Positionen ermitteln Java Basics - Anfänger-Themen 4
C Klassen aus einem Package ermitteln und per Laufzeit laden Java Basics - Anfänger-Themen 17
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
L Aus Datum Millisekunden ermitteln ohne Zeitzonen-Berücksichtigung Java Basics - Anfänger-Themen 6
C OOP Schwerpunkt eines Dreiecks ermitteln Java Basics - Anfänger-Themen 4
I Zeitraum eines Monats ermitteln und in String ausgeben Java Basics - Anfänger-Themen 1
S Datentypen Dimensionalität eines Arrays ermitteln Java Basics - Anfänger-Themen 2
V Anzahl von gleichen Werten in einem Int-Array ermitteln Java Basics - Anfänger-Themen 4
D TreeMap: Höheren Key ermitteln und den Value liefern Java Basics - Anfänger-Themen 3
J In einem Array die größte Zahl ermitteln und Faktorisieren. Java Basics - Anfänger-Themen 5
V Array ermitteln - in Quellcode speichern Java Basics - Anfänger-Themen 15
H JEditorPane: ermitteln, ob Zeichen unterstrichen Java Basics - Anfänger-Themen 4
M Monat der letzen 12 Monate ermitteln Java Basics - Anfänger-Themen 8
MiMa String Datum ermitteln Java Basics - Anfänger-Themen 9
H Veränderung eines Objekts ermitteln Java Basics - Anfänger-Themen 6
S Wochentage ermitteln Java Basics - Anfänger-Themen 5
S Ermitteln und Setzen der Attribute eines Objektes Java Basics - Anfänger-Themen 6
F Den Gewinner der Tordifferenz ermitteln Java Basics - Anfänger-Themen 5
J Eltern-Fenster ermitteln Java Basics - Anfänger-Themen 2
S MP3 Spielzeit mit jid3lib ermitteln? Java Basics - Anfänger-Themen 3
M Größer der eigenen .jar ermitteln Java Basics - Anfänger-Themen 4
M Größe einer Datei via. Link ermitteln Java Basics - Anfänger-Themen 9
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
C Nächsten Montag ermitteln Java Basics - Anfänger-Themen 19
W Position in ArrayList ermitteln Java Basics - Anfänger-Themen 4
B Font Namen ermitteln Java Basics - Anfänger-Themen 7
C least significant bit einer HexMaske für Bitshift ermitteln Java Basics - Anfänger-Themen 2
B Pfad einer .jar im Programm ermitteln Java Basics - Anfänger-Themen 13
H "Index" eines Button ermitteln Java Basics - Anfänger-Themen 7
C Bereits geöffnetes Object ermitteln Java Basics - Anfänger-Themen 5
S ermitteln eines Wertes im StringArray Java Basics - Anfänger-Themen 4
D Ermitteln des kleinsten Messwertes von jedem Tag Java Basics - Anfänger-Themen 15
C Hösten Wert aus mehren Listen ermitteln Java Basics - Anfänger-Themen 2
D Input/Output Pfad richtig ermitteln Java Basics - Anfänger-Themen 12
P Dateigröße von Ordnern ermitteln Java Basics - Anfänger-Themen 8
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
J den x und y Wert beim klicken der Maus ermitteln Java Basics - Anfänger-Themen 2
M float/double Anzahl Nachkommastellen ermitteln Java Basics - Anfänger-Themen 18
G Sekunden bis zum Ende der aktuellen Kalenderwoche ermitteln! Java Basics - Anfänger-Themen 3
F Substring mittels RegEx ermitteln/ersetzen? Java Basics - Anfänger-Themen 2
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
Spin Backgrond Color von Image ermitteln Java Basics - Anfänger-Themen 2
M Größe einer Konsole ermitteln Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben