Java 为什么.equals()不起作用
我打印了两个字符串,它们完全相同,没有空格,因为我替换了它们。 这里是编译的Java 为什么.equals()不起作用,java,string,replace,equals,Java,String,Replace,Equals,我打印了两个字符串,它们完全相同,没有空格,因为我替换了它们。 这里是编译的 public class Palindrome{ public static boolean isPalindrome(String word){ int length; String oppositeWord =""; word = word.replace(" ",""); word = word.toLowerCase();
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"));
}
}
将字符替换为“\0”与同时删除该字符不同。当你打印它时,它不会显示出来,所以它们看起来是一样的,但它仍然存在,并且会使它们不相等 试着将长度与单词一起打印。这一行是错误的:
word = word.replace(word.charAt(i),'\0');
用\0
替换字符与删除字符不同。你想要这样的东西:
word = word.replace(""+word.charAt(i), "");
然而,正如上面所说,有更好的方法来检查一个单词是否是回文
另外,我不知道为什么,但是您的ideone.com显示了与我的IDE(NetBeans)不同的输出。你的作品显示:
madamimadam
madamimadam
false
但作为一个例子,其结果是:
madamimadam
madam i madam
false
这就解释了为什么结果为
false
。我最好的猜测是,您的在线IDE在将您添加的\0
转换为文本时遇到了一些问题,只是没有打印任何内容。首先,Java字符串是不可变的,不应该逐个字符进行操作(这就是Java库具有StringBuilder和StringBuffer类的原因)
其次,Java字符串实际上并不等同于C/C++中的char[]
。它们更像是char*
,因为它们指向保存实际信息的其他内存。将非字母字符更改为'\0'
空字符不会从字符串中删除它们。它们不会打印在屏幕上,但仍存在于内存中。(这是Java字符串不同于C/C++字符串的一种方式……Java字符串不是以null结尾的字符数组!)
如果您添加一些打印语句来打印长度,您会发现对立词
比词
小两个字符
System.out.println(oppositeWord.length()); // prints 11
System.out.println(word.length()); // prints 13
要使两个字符串真正相等,在word
中替换的相同字符也必须以相同的索引插入到oppositeWord
中,或者从两者中删除。i、 e
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!
}
}
for(int i=length-1;i>=0;i--){
if(Character.isleter(word.charAt(i))){
对立词+=字字符(i);
}否则{
word=word.replace(word.charAt(i),“\0”);
对立词+=单词字符(i);//正如bluemoon93所提到的,这两个字符串实际上并不相等。原始字符串是madam i madam。这意味着它包含使两个字符串不同的空格。我建议您使用正则表达式从原始字符串中删除标点、空格。这将删除任何额外的空格或标点
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,因为两个字符串是相等的,因为它们由有效字符匹配,并且不包含空格或标点符号。为什么要变异word
?我不知道你在问什么。它们不一样……相反的word是madamimadam
,其中as word是madamimadam
@TedBigham我复制了他的代码并在Eclipse中运行。这就是输出。它可能与他使用的0字节有关。SCNR:另一个回文
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);
}