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