繁体   English   中英

为什么 .equals() 不起作用

[英]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 wordword小了两个字符。

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

另外仅供参考, StringBuilderStringBuffer都有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM