我必须使用方法来测试一个句子的回文并且我已经完成了大部分工作,但它只会在字符串中执行第一个单词,而不会继续执行到下一个单词。我相信它与空间有关,如果有人能提供帮助那就太好了。此外,我还没有研究过数组,所以如果不使用数组,我会很感激。
class palindromeTesting
{
public static void main(String[] args)
{
String userInput;
String goodWords;
String palindromes;
System.out.println("Please enter a sentance to be tested for palindrome: ");
userInput = EasyIn.getString();
userInput += " " ;
goodWords = charsCheck(userInput); //Calling a method to check if any word contains more than letters.
palindromes = palinCheck(goodWords); //Checking the good words to see if they're palindromes.
System.out.println("The valid palindromes are " + palindromes);
} //Main
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
public static String charsCheck(String userInput)
{
String validWords;
String firstWord;
Boolean goodWord;
int spacePos;
char letter;
spacePos = userInput.indexOf(" ");
validWords = "";
while(spacePos > 0)
{
firstWord = userInput.substring(0 , spacePos);
goodWord = true;
for(int index = 0 ; index < firstWord.length() && goodWord == true ; index++)
{
spacePos = userInput.indexOf(" ");
letter = Character.toUpperCase(firstWord.charAt(index));
if(letter < 'A' || letter > 'Z' )
{
goodWord = false;
}
} //for
if(goodWord == true)
{
firstWord = firstWord + " ";
validWords = validWords + firstWord;
}
userInput = userInput.substring(spacePos + 1);
spacePos = userInput.indexOf(" ");
} //While
return validWords;
} //charsCheck main
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
public static String palinCheck(String goodWords)
{
String firstWord;
String validPalins = "";
String backward = "";
int spacePos;
spacePos = goodWords.indexOf(" ");
while(spacePos > 0)
{
firstWord = goodWords.substring(0 , spacePos);
for(int i = firstWord.length()-1; i >= 0; i--)
{
backward = backward + firstWord.charAt(i);
}
if(firstWord.equals(backward))
{
validPalins = validPalins + firstWord;
}
goodWords = goodWords.substring(spacePos + 1) ;
spacePos = goodWords.indexOf(" ") ;
}//While
return validPalins;
} //palinCheck main
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
} //Class
答案 0 :(得分:0)
如果您认为问题是空格,则可以始终使用replaceAll()
方法(check out the API)删除所有空格(以及任何其他不需要的字符)。假设您要比较word1
和word2
以确定它们是否是回文,请执行以下操作:
String word1 = "du mb";
String word2 = "b,mu d";
word1 = word1.replaceAll(" ", "");//replace it with empty string
word1 = word1.replaceAll(",", "");//even if the comma doesn't exist, this method will be fine.
word2 = word2.replaceAll(" ", "");
word2 = word2.replaceAll(",", "");
一旦你被不必要的角色或空间所占据,那么你应该进行检查。此外,您可以始终使用 正则表达式 表达式来完成此类任务,但对于初学者来说,这可能有点难以学习。
另外,我建议使用for
循环(可能在一个for
循环中完成,但嵌套循环可以)而不是while
循环用于此任务。看看这个example。
<强> 旁注 强>:
此外,我还没有研究过数组,所以如果数组不是,我会很感激 使用
字符串本质上是char
数组。
答案 1 :(得分:0)
您描述的问题实际上并非发生了什么;你的代码确实继续下一个单词。对于我的测试,我使用了测试输入Hi my name is blolb
。
问题出在您的palinCheck
方法中。您正在使用backward
变量来反转该单词并检查它是否与firstWord
相等。但是,您没有将backward
变量重置为循环中的空字符串。因此,您将不断添加之前循环中的所有内容。在方法结束时,如果我使用上面的测试字符串检查backward
的内容,它实际上看起来像iHymemansiblolb
。
要解决此问题,只需在while循环中声明String backward
,如下所示:
while(spacePos > 0) {
String backward = "";
// rest of loop
快速注释:
在palinCheck
方法运行期间,当您执行此操作时,每次迭代都会更改goodWords
参数:
goodWords = goodWords.substring(spacePos + 1) ;
虽然这在技术上是可以接受的(它在方法之外没有影响),但我不认为修改这样的方法参数是一个好习惯。我会在方法的顶部创建一个新的String
变量,或者称之为currentGoodWords
或类似的变量,然后将您的行更改为:
currentGoodWords = goodWords.substring(spacePos + 1) ;
另外,我认为这是作业,所以如果你被允许使用它,我肯定会看看Elliot Frisch提到的StringBuilder#reverse()
方法(我承认,我以前从未知道过这种方法) ,所以Elliot的主要成绩是+1。
答案 2 :(得分:0)
我很久以前在palindrome上使用最短的代码编写了这个代码作为个人项目。它基本上剥离了每个非单词字符,只用13行就把它放到小写字母中。希望这有帮助哈哈!让我们希望其他人也能幸运地找到这个。
import java.util.Scanner;
public class Palindrome {
public static void main(String[]args){
if(isReverse()){System.out.println("This is a palindrome.");}
else{System.out.print("This is not a palindrome");}
}
public static boolean isReverse(){
Scanner keyboard = new Scanner(System.in);
System.out.print("Please type something: ");
String line = ((keyboard.nextLine()).toLowerCase()).replaceAll("\\W","");
return (line.equals(new StringBuffer(line).reverse().toString()));
}
}