[英]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.