[英]Why does .equals() not working
我打印了 2 个字符串,它们实际上完全相同,没有空格,因为我替换了它们。 https://ideone.com/cw07LG这里编译
public class Palindrome{
public static boolean isPalindrome(String word){
int length;
String oppositeWord ="";
word = word.replace(" ","");
word = word.toLowerCase();
length = word.length();
for(int i=length-1;i>=0;i--){
if(Character.isLetter(word.charAt(i))){
oppositeWord +=word.charAt(i);
}else{
word = word.replace(word.charAt(i),'\0');
}
}
System.out.println(oppositeWord);
System.out.println(word);
return oppositeWord.equals(word);
}
public static void main(String[]args){
System.out.println(isPalindrome("Madam, I'm Adam"));
}
}
首先,Java 字符串是不可变的,不应逐个字符地进行操作(这就是 Java 库具有 StringBuilder 和 StringBuffer 类的原因)。
其次,Java 字符串并不真正等同于 C/C++ 中的char[]
。 它们更像char*
,因为它们指向其他一些保存实际信息的内存。 将非字母字符更改为'\\0'
空字符不会将它们从字符串中删除。 它们不打印在屏幕上,但仍然存在于内存中。 (这是 Java 字符串与 C/C++ 字符串不同的一种方式……Java 字符串不是以空字符结尾的字符数组!)
如果添加一些print语句来打印长度,你会发现oppositeWord
word
比word
小了两个字符。
System.out.println(oppositeWord.length()); // prints 11
System.out.println(word.length()); // prints 13
要真正使两个字符串相等,在word
替换的相同字符也必须插入到oppositeWord
中相同的索引处或从两者中完全删除。 IE
for(int i=length-1;i>=0;i--) {
if(Character.isLetter(word.charAt(i))) {
oppositeWord +=word.charAt(i);
} else {
word = word.replace(word.charAt(i),'\0');
oppositeWord += word.charAt(i); // << This line!
}
}
现在,两个字符串将包含相同的信息,而oppositeWord.equals(word)
将保留。
另外仅供参考, StringBuilder
和StringBuffer
都有reverse()
方法,可用于简化此过程。
用 '\\0' 替换字符与将字符全部删除不同。 当你打印它时它不会出现,所以它们看起来是一样的,但它仍然存在并且会使它们不相等。
尝试将长度和单词一起打印出来。
这一行是错误的:
word = word.replace(word.charAt(i),'\0');
用\\0
替换字符与删除它不同。 你想要这样的东西:
word = word.replace(""+word.charAt(i), "");
然而,就像这条评论所说的,有更好的方法来检查一个词是否是回文。
另外,我不知道为什么,但是您的 ideone.com 显示了与我的 IDE (NetBeans) 不同的输出。 你的显示:
madamimadam
madamimadam
false
但正如Qbrute 指出的那样,输出是:
madamimadam
madam i madam
false
这解释了为什么结果是false
。 我最好的猜测是,您的在线 IDE 在将您添加的\\0
转换为文本时遇到了一些麻烦,并且不打印任何内容。
正如 bluemoon93 所提到的,这两个字符串实际上是不相等的。 原来的字符串是女士我女士。 这意味着它由使两个字符串不同的空格组成。 我建议您使用正则表达式从原始字符串中删除标点符号和空格。 这将删除任何额外的空格或标点符号。
public boolean isPalindrome(String word){
int length;
String oppositeWord ="";
word = word.toLowerCase();
length = word.length();
String newword = word.replaceAll("[\\s\\p{Punct}]", "");
for(int i=length-1;i>=0;i--){
if(Character.isLetter(word.charAt(i))){
oppositeWord +=word.charAt(i);
}
}
System.out.println(oppositeWord);
System.out.println(newword);
return oppositeWord.equals(newword);
}
返回结果现在将返回 true,因为两个字符串相等,因为它们与有效字符匹配,并且不包含空格或标点符号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.