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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1563597/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 14:08:32  来源:igfitidea点击:

Palindrome tester with Java, ignoring spaces and punctuation

javapalindrome

提问by

I have the program made up until the point where it has to ignore and punctuations and spaces in the thread and I was wondering if anyone could help me with the coding for that? What I've been trying out doesn't seem to be working. Here is what I have so far:

我已经编写了程序,直到它必须忽略线程中的标点符号和空格,我想知道是否有人可以帮助我进行编码?我一直在尝试的东西似乎不起作用。这是我到目前为止所拥有的:

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();
    }

 }

}

回答by Jim Garrison

You could simplify the code significantly by removing all the spaces and punctuation before you start. Look at String.replaceAll(regex,replacement). You would write a regular expression to match blanks and punctuation, and provide an empty string ("") as the replacement. This will return a new string containing the original minus the characters you want to ignore.

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

回答by Jim Garrison

Look at char's documentation entry. Specifically the isLetterOrDigitmethod. If that method returns false, then it's punctuation or a space. There are other methods in there as well that can help with that.

查看char 的文档条目。具体isLetterOrDigit方法。如果该方法返回 false,则它是标点符号或空格。还有其他方法可以帮助解决这个问题。

回答by Denis Tulskiy

Just to clarify what Jim Garrison said, the regex you need is the following

只是为了澄清吉姆加里森所说的,您需要的正则表达式如下

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

This will leave only letters and digits and remove whitespace and punctuation, i.e. m will become "madamimadam" and you can run you regular palindrome test on that string.

这将只留下字母和数字并删除空格和标点符号,即 m 将成为“madamimadam”,您可以在该字符串上运行常规回文测试。

You can learn more about regular expressions here

您可以在此处了解有关正则表达式的更多信息

回答by Jordan Snook

Your Problem: You are not ignoring the case of the letters. So if you try Able was I, ere I saw Elba, it will not come back correctly, although it is a true palindrome.

你的问题:你没有忽略字母的大小写。因此,如果您尝试 Able is I,在我看到 Elba 之前,它不会正确返回,尽管它是一个真正的回文。

回答by Joey

This is the programming assignment from the Java Software Solutions (PP3.11) that I assign my students. Ironically the teacher solution uses Character.isLetterOrDigit(___)(which is never mentioned in the book) and uses methods to get rid of spaces and punctuation (having not even taught methods at that point in the book), and char is not an official part of the AP CS subset. Silly publishers.

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

回答by Alberto

This code for determine if a word is a palindrome can be much more simplified. Find updated Code

这段用于确定单词是否为回文的代码可以简化得多。查找更新的代码

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");
}

}
}

回答by roshan213

This looks like a really old post but I think I stumbled upon a simpler solution for a palindrome test. This checks the first and last characters and moves inwards and exits the program as soon as the characters do not match.

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

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"
    }
}