回文失败
Palindrome Fail
你好(我的第一个post),
我应该编写一个程序来检查句子或单词是否为回文。为此,我必须使用 Stacks。
问题是我在控制台中打印了两个解决方案,但即使它们是相同的 returns false.
我的代码:
public class Palindrome {
// Test if text is a palindrome.
// Ignore upper/lower case, white space, and punctuation.
//
public static boolean isPalindrome(String text) {
boolean ispalin =false;
char tmp;
String temp = text;
String text2 = "";
String check = "";
Stack<Character> stacktext = new Stack<Character>();
Stack<Character> stackcheck = new Stack<Character>();
text = text.toLowerCase();
for (int j = 0; j < text.length(); j++) {
if( text.charAt(j) != ' '&&
text.charAt(j) != ','&&
text.charAt(j) != '?'&&
text.charAt(j) != '.'&& //delete some symbols
text.charAt(j) != '!'&&
text.charAt(j) != '-'){
tmp = text.charAt(j);
text2 += tmp;
}
}
for (int j = text.length()-1; j > -1; j--) {
if( text.charAt(j) != ' '&&
text.charAt(j) != ','&&
text.charAt(j) != '?'&&
text.charAt(j) != '.'&&
text.charAt(j) != '!'&&
text.charAt(j) != '-'){
tmp = text.charAt(j);
check += tmp;
}
}
for (int i = 0; i < text2.length(); i++) {
stacktext.push(text2.charAt(i));
}
for (int i = check.length()-1; i != -1; i--) {
stackcheck.push(check.charAt(i));
}
System.out.println(stackcheck);
System.out.println(stacktext);
if (stackcheck == stacktext) return true;
else return false;
}
public static void main(String[] args) {
System.out.println(isPalindrome("Na, Fakir, Paprika-Fan?"));
}
}
输出:
[n, a, f, a, k, i, r, p, a, p, r, i, k, a, f, a, n]
[n, a, f, a, k, i, r, p, a, p, r, i, k, a, f, a, n]
false
第一个问题就是你的比较
//...
if (stackcheck == stacktext) return true;
else return false;
//...
将始终评估为 false,这是两个不同的对象。
你需要:
//...
if (stackcheck.equals(stacktext)) return true;
else return false;
//
或者更好:
//...
return stackcheck.equals(stacktext);
//...
另一个问题是字符串以相同的顺序放置在 Stack
中并且没有被颠倒,因此无论字符串是 paindromes 还是比较总是评估为 true
没有。
Working sample, using StringBuilder
把第二个字符串check
倒序加到stackcheck
中,当然你自己也可以,倒序加到Stack
中.
public static boolean isPalindrome(String text)
{
text = text.toLowerCase();
String text2 = text.replaceAll("[,. !?-]", ""); //replaceAll to remove characters
String check = new StringBuilder(text2).reverse().toString(); //reverse string
Stack<Character> stacktext = new Stack<>();
Stack<Character> stackcheck = new Stack<>();
for (int i = 0; i < text2.length(); i++)
{
stacktext.add(text2.charAt(i));
}
for (int i = 0; i < check.length(); i++)
{
stackcheck.add(check.charAt(i));
}
System.out.println(stackcheck);
System.out.println(stacktext);
return stackcheck.equals(stacktext);
}
你好(我的第一个post), 我应该编写一个程序来检查句子或单词是否为回文。为此,我必须使用 Stacks。 问题是我在控制台中打印了两个解决方案,但即使它们是相同的 returns false.
我的代码:
public class Palindrome {
// Test if text is a palindrome.
// Ignore upper/lower case, white space, and punctuation.
//
public static boolean isPalindrome(String text) {
boolean ispalin =false;
char tmp;
String temp = text;
String text2 = "";
String check = "";
Stack<Character> stacktext = new Stack<Character>();
Stack<Character> stackcheck = new Stack<Character>();
text = text.toLowerCase();
for (int j = 0; j < text.length(); j++) {
if( text.charAt(j) != ' '&&
text.charAt(j) != ','&&
text.charAt(j) != '?'&&
text.charAt(j) != '.'&& //delete some symbols
text.charAt(j) != '!'&&
text.charAt(j) != '-'){
tmp = text.charAt(j);
text2 += tmp;
}
}
for (int j = text.length()-1; j > -1; j--) {
if( text.charAt(j) != ' '&&
text.charAt(j) != ','&&
text.charAt(j) != '?'&&
text.charAt(j) != '.'&&
text.charAt(j) != '!'&&
text.charAt(j) != '-'){
tmp = text.charAt(j);
check += tmp;
}
}
for (int i = 0; i < text2.length(); i++) {
stacktext.push(text2.charAt(i));
}
for (int i = check.length()-1; i != -1; i--) {
stackcheck.push(check.charAt(i));
}
System.out.println(stackcheck);
System.out.println(stacktext);
if (stackcheck == stacktext) return true;
else return false;
}
public static void main(String[] args) {
System.out.println(isPalindrome("Na, Fakir, Paprika-Fan?"));
}
}
输出:
[n, a, f, a, k, i, r, p, a, p, r, i, k, a, f, a, n]
[n, a, f, a, k, i, r, p, a, p, r, i, k, a, f, a, n]
false
第一个问题就是你的比较
//...
if (stackcheck == stacktext) return true;
else return false;
//...
将始终评估为 false,这是两个不同的对象。
你需要:
//...
if (stackcheck.equals(stacktext)) return true;
else return false;
//
或者更好:
//...
return stackcheck.equals(stacktext);
//...
另一个问题是字符串以相同的顺序放置在 Stack
中并且没有被颠倒,因此无论字符串是 paindromes 还是比较总是评估为 true
没有。
Working sample, using StringBuilder
把第二个字符串check
倒序加到stackcheck
中,当然你自己也可以,倒序加到Stack
中.
public static boolean isPalindrome(String text)
{
text = text.toLowerCase();
String text2 = text.replaceAll("[,. !?-]", ""); //replaceAll to remove characters
String check = new StringBuilder(text2).reverse().toString(); //reverse string
Stack<Character> stacktext = new Stack<>();
Stack<Character> stackcheck = new Stack<>();
for (int i = 0; i < text2.length(); i++)
{
stacktext.add(text2.charAt(i));
}
for (int i = 0; i < check.length(); i++)
{
stackcheck.add(check.charAt(i));
}
System.out.println(stackcheck);
System.out.println(stacktext);
return stackcheck.equals(stacktext);
}