簡體   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