Porównanie dla wartości String (palindromy)

0

Piszę sobie taką wprawkę, która ma sprawdzać, czy podany przez użytkownika wyraz jest palindromem. Spłodziłem taki kod (poniżej), ale dla każdego wpisanego wyrazu otrzymuję wartość false. Gdzie robię błąd ?

import java.util.*;
public class Palindrome {
    public static boolean palindrome(String text) {
        int i, len = text.length();
        StringBuilder dest = new StringBuilder(len);
        for (i = (len - 1); i >= 0; i--){
            dest.append(text.charAt(i));
        }
        String palindrm = dest.toString();
        System.out.println (palindrm);
        if ( palindrm == text) { 
            return true;
        }
        else return false;
    }

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);

        System.out.println("Type a text: ");
        String text = reader.nextLine();
        if (palindrome(text)) {
           System.out.println("The text is a palindrome!");
        } else {
           System.out.println("The text is not a palindrome!");
        }
    }

}
1

Źle porównujesz Stringi:

if ( palindrm.equals( text))

W klasie StringBuilder odwracać można prościej:

StringBuilder sb = new StringBuilder(text);
palindrome = sb.reverse().toString();
0

Dzięki :)

2

Kilka propozycji "podkręcenia" programu (od najłatwiejszej):

  • program nie zwraca uwagi na wielkość liter - Kajak jest palindromem,
  • program ignoruje spacje - kobyła ma mały bok jest palindromem,
  • program ignoruje znaki interpunkcyjne - I lali masoni wydrom w mordy wino, sami lali! oraz Albo nałowi ci Wałęsa masę ławic i woła: "Nobla!" są palindromami.
0

Dziś już nie dam rady, ale jutro wieczorem po pracy siadam do "podkręcania" :)

0

*program nie zwraca uwagi na wielkość liter - Kajak jest palindromem

Zrobione:


import java.util.*;
public class Palindrome {
    public static boolean palindrome(String text) {
        text = text.toLowerCase();
        int i, len = text.length();
        StringBuilder dest = new StringBuilder(len);
        for (i = (len - 1); i >= 0; i--){
            dest.append(text.charAt(i));
        }
        String palindrm = dest.toString();
        System.out.println (palindrm);
        if ( palindrm.equals( text)) { 
            return true;
        }
        else return false;
    }

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);

        System.out.println("Type a text: ");
        String text = reader.nextLine();
        if (palindrome(text)) {
           System.out.println("The text is a palindrome!");
        } else {
           System.out.println("The text is not a palindrome!");
        }
    }

}
1

Udało się wszystkie 3 punkty zrealizować. Rozwiązanie chyba mało "eleganckie", ale skuteczne. Na pewno jest jakiś lepszy sposób. Proszę o podpowiedź :)

import java.util.*;
public class Palindrome {
    public static boolean palindrome(String text) {
        text = text.toLowerCase();
        text = text.replace(" ","");
        text = text.replace(".","");
        text = text.replace(",","");
        text = text.replace("?","");
        text = text.replace("!","");
        text = text.replace(":","");
        text = text.replace("\"","");
        int i, len = text.length();
        StringBuilder dest = new StringBuilder(len);
        for (i = (len - 1); i >= 0; i--){
            dest.append(text.charAt(i));
        }
        String palindrm = dest.toString();
        System.out.println (palindrm);
        if ( palindrm.equalsIgnoreCase( text)) { 
            return true;
        }
        else return false;
    }

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);

        System.out.println("Type a text: ");
        String text = reader.nextLine();
        if (palindrome(text)) {
           System.out.println("The text is a palindrome!");
        } else {
           System.out.println("The text is not a palindrome!");
        }
    }

}
1

Wersja, w której łatwiej modyfikuje się listę znaków do pominięcia.

    private boolean isPalindrome(String str, boolean isCaseSensitive)
    {
        if(!isCaseSensitive)
        {
            str = str.toLowerCase();
        }
        String[] skipped = {" ","!","-","_","+","=","{","}","[","]",";",":","\'","\"",",",".","?"};
        for(int i=0;i<skipped.length;i++)
        {
            str = str.replace(skipped[i],"");
        }
        StringBuilder sb = new StringBuilder(str);
        String reverse = sb.reverse().toString();
        return str.equals(reverse);
    }

Wersja "pozytywna" - podajemy co uwzględnić, a nie co pominąć.

    private boolean isPalindrome(String txt)
    {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < txt.length(); i++)
        {
            char c = txt.charAt(i);
            if(Character.isDigit(c) || Character.isAlphabetic(c))
            {
                sb.append(c);
            }
        }        
        return txt.equals(sb.reverse().toString());
    }
0

Dzięki :)

0

A czy nie łatwiej to obrócić za pomocą sprawdzenia codepointów?

class Palindromy {

    static String palindrom ="Albo nałowi ci Wałęsa masę ławic i woła: \"Nobla!\"";

    public static void main(String[] args) {
        char literki[] =palindrom.toCharArray();
        StringBuffer temp = new StringBuffer();
        for (char c : literki) {
            if(Character.isAlphabetic(c)){
                temp.append(c);
            }
        }
        System.out.println(
                temp.toString()
                .equalsIgnoreCase(
                        temp.reverse().toString()
                )
        );
    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0