使用Java的回文测试器,忽略空格和标点符号

时间:2009-10-13 23:56:39

标签: java palindrome

我有一个程序,直到它必须忽略和线程中的标点符号和空格,我想知道是否有人可以帮我编码?我一直在尝试的东西似乎没有起作用。以下是我到目前为止的情况:

import java.util.Scanner;

public class PalindromeTester
{
public static void main (String[] args)

{

    String str, another = "y";

    int left, right;

    char charLeft, charRight;


    Scanner scan = new Scanner (System.in);


    while (another.equalsIgnoreCase("y")) // allows y or Y

    {

        System.out.println ("Enter a potential palindrome: ");

        str = scan.nextLine();

        left = 0;

        right = str.length() - 1;


        while (left < right)
        {
            charLeft = str.charAt(left);
            charRight = str.charAt(right);


            if (charLeft == charRight)
            {
                left++;
                right--;
            }

            else if (charLeft == ',' || charLeft == '.' ||
 charLeft == '-' || charLeft == ':' ||
 charLeft == ';' || charLeft == ' ')

                left++;

            else if (charRight == ',' || charRight == '.' ||
 charRight == '-' || charRight == ':' ||
 charRight == ';' || charRight == ' ')
                right--;
            else

                break;

        }

    System.out.println();


        if (left < right)
            System.out.println ("That string is NOT a palindrome.");
                        else

            System.out.println ("That string IS a palindrome.");


        System.out.println();

    System.out.print ("Test another palindrome (y/n)? ");

    another = scan.nextLine();
    }

 }

}

7 个答案:

答案 0 :(得分:9)

只是为了澄清Jim Garrison所说的,你需要的正则表达式是以下

String m = "Madam, I'm'',.,.''   Adam";
m = m.toLowerCase().replaceAll("\\W", "");

这将只留下字母和数字,并删除空格和标点符号,即m将变为“madamimadam”,你可以对该字符串进行常规的回文测试。

您可以详细了解正则表达式here

答案 1 :(得分:5)

用于确定单词是否为回文结构的此代码可以更加简化。查找更新的代码

String word;
int z;
int y = 0;
int i = 0;

char letter;

Scanner input = new Scanner(System.in);

System.out.print("Enter a word: ");
word = input.nextLine();

word = word.replaceAll("\\s+", "");
word = word.toLowerCase();

z = word.length()-1;
while (i <= z){

    if ((letter = word.charAt(i)) == (letter = word.charAt(z-i))){
        y += 1;
    }
    i += 1;
}

if (y == (z+1)){
    System.out.println("The word IS a palindrome");
}
else{
    System.out.println("The word is NOT a palindrome");
}

}
}

答案 2 :(得分:5)

这看起来像一个很老的帖子,但我想我偶然发现了一个更简单的回文测试解决方案。这将检查第一个和最后一个字符并向内移动,并在字符不匹配时立即退出程序。

public class CharTest {
    public static void main(String[] args) {
             //converts string to lowercase and replaces everything except numbers
             // and alphabets
        String s = "Niagara. O roar again!".toLowerCase().replaceAll("\\W", "");
        int j=0;
        int k = s.length() - 1;
        while(j < s.length() / 2) { //loops until half the length of the string if 
                                        //even and floor value if odd.
            if (s.charAt(j++) != s.charAt(k--)){//check for first and last chars                                                                                                
                                              //and  go inwards. if char do not match print 'Not a Palindrome' and exit 
                System.out.println("Not a Palindrome");
            System.exit(0);}
        }
        System.out.println("Palindrome");  //if every chars match print "Palindrome"
    }
}

答案 3 :(得分:4)

您可以在开始之前删除所有空格和标点符号,从而显着简化代码。看看String.replaceAll(正则表达式,替换)。您可以编写正则表达式来匹配空格和标点符号,并提供空字符串(“”)作为替换。这将返回一个包含原始字母的新字符串减去您要忽略的字符。

答案 4 :(得分:3)

这是我为学生分配的Java软件解决方案(PP3.11)的编程作业。具有讽刺意味的是,教师解决方案使用Character.isLetterOrDigit(___)(书中从未提及)并使用方法来摆脱空格和标点符号(在书中的那一点上甚至没有教授方法),而char不是官方部分AP CS子集的。愚蠢的出版商。

答案 5 :(得分:2)

看看char's documentation entry。特别是isLetterOrDigit方法。如果该方法返回false,那么它是标点符号或空格。还有其他方法可以帮助解决这个问题。

答案 6 :(得分:2)

你的问题:你不是在忽视这些字母的情况。因此,如果你尝试Able是我,我看到厄尔巴岛,它将无法正确回归,虽然这是一个真正的回文。