import java.util.Scanner;
public class Ex3 {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.print("Please input a word: ");
String Line = keyboard.nextLine();
boolean x = isReverse(Line);
System.out.print("It is " + x + " that this word is a palindrome.");
}
public static boolean isReverse(String Line) {
int length = Line.length();
boolean x = true;
String s = "";
for (int i = 0; i < length; i++) {
if (Line.charAt(i) != ' ') {
s += Line.charAt(i);
}
}
for (int i = 0; i < length; i++) {
if (Line.charAt(i) != Line.charAt(length - 1 -i)) {
x = false;
}
}
return x;
}
}
我想做的是制作一个程序,该程序将一个单词或短语作为输入,并根据它是否是回文返回true或false。在程序中,我应该忽略空格和标点符号,并制作回文,如“一个人,一个计划,一条运河,巴拿马”我想我已经解决了空格问题,但不知道如何忽略所有标点符号。
您可以使用正则表达式从字符串中删除所有非单词字符:\\W
表示非单词字符
String s = "A man, a plan, a canal, Panama.";
String lettersOnly = s.replaceAll("[\\W]", "");
System.out.println("lettersOnly = " + lettersOnly);
输出:
lettersOnly=MANANAPLANACANA巴拿马
如果你想减少代码的长度,你也可以使用StringBuilder#反转
来反转字符串:
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.print("Please input a word: ");
String line = keyboard.nextLine();
String cleanLine = line.replaceAll("[\\W]", "");
String reverse = new StringBuilder(cleanLine).reverse().toString();
boolean isPalindrome = cleanLine.equals(reverse);
System.out.print("It is " + isPalindrome + " that this word is a palindrome.");
}
编辑
如果您需要坚持循环,您可以简单地在循环中检查字符是否是字母:
public static boolean isReverse(String Line) {
int length = Line.length();
boolean x = true;
String s = "";
for (int i = 0; i < length; i++) {
if ((Line.charAt(i) >= 'a' && Line.charAt(i) <= 'z')
|| (Line.charAt(i) >= 'A' && Line.charAt(i) <= 'Z')) {
s += Line.charAt(i);
}
}
注意:大小写会有问题(A
! = a
)-一个简单的解决方法是首先使用String lowerCase=Line. toLowerCase();
将所有字符放在小写中。
Apache Commons Long中的StringUtils
类有一些可能很方便的方法,包括deleteWhitespace()
和差异()
。将字符串与您要删除的所有标点符号字符串一起传递给差异()
将返回一个无标点符号字符串。