我有一个程序,直到它必须忽略和线程中的标点符号和空格,我想知道是否有人可以帮我编码?我一直在尝试的东西似乎没有起作用。以下是我到目前为止的情况:
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();
}
}
}
答案 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是我,我看到厄尔巴岛,它将无法正确回归,虽然这是一个真正的回文。