为什么.equals()不起作用

时间:2016-02-04 21:04:56

标签: java string replace equals

我打印了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"));
    }
}

4 个答案:

答案 0 :(得分:1)

首先,Java字符串是不可变的,不应该逐个字符地操作(这就是Java库具有StringBuilder和StringBuffer类的原因)。

其次,Java Strings并不等同于C / C ++中的char[]。它们更像char*,因为它们指向包含实际信息的其他内存。将非字母字符更改为'\0'空字符不会从字符串中删除它们。它们不会打印在屏幕上,但仍存在于内存中。 (这是Java字符串与C / C ++字符串不同的一种方式...... Java字符串不是以空字符结尾的字符数组!)

如果您添加一些打印语句来打印长度,您会发现oppositeWordword小两个字符。

System.out.println(oppositeWord.length()); // prints  11
System.out.println(word.length());         // prints  13

要真正使两个字符串相等,word中替换的相同字符也必须在oppositeWord中插入相同的索引,或者从两者中完全删除。即。

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)将保留。

另外,仅供参考,StringBuilderStringBuffer都有reverse()方法,可用于简化此过程。

答案 1 :(得分:0)

用'\ 0'替换一个字符与将所有字符一起删除不是一回事。打印时它不会显示,所以看起来一样,但它仍然存在并且会使它们不相等。

尝试打印长度和单词。

答案 2 :(得分:0)

这一行错了:

word = word.replace(word.charAt(i),'\0');

\0替换字符与删除字符不同。你想要这样的东西:

word = word.replace(""+word.charAt(i), "");

然而,正如comment所述,有更好的方法来检查单词是否是回文。

另外,我不确定原因,但您的ideone.com显示了与IDE(NetBeans)不同的输出。你的节目显示:

madamimadam
madamimadam
false

但是Qbrute points out,输出为:

madamimadam
madam  i  madam
false

这解释了结果为false的原因。我最好的猜测是,您的在线IDE在将您添加的\0转换为文本时遇到了一些问题,而且不会打印任何内容。

答案 3 :(得分: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,因为两个字符串相等,因为它们与有效字符匹配且不包含空格或标点符号。