2017-10-04 59 views
-5
class palindrome 
{ 
    public static void main(String args[]) 
    { 
     String s1=new String(); 
     Scanner sc= new Scanner(System.in); 
     System.out.println("Enter the string:"); 
     s1=sc.nextLine(); 
     StringBuffer s2=new StringBuffer(s1); 
     s2.reverse().toString();  
     if(s1.equals(s2.toString())) 
      System.out.println("Given String is palindrome"); 
     else 
      System.out.println("Given String is not palindrome"); 
    } 
} 

這是我的代碼,用於檢查string是否是迴文。Java String和StringBuffer如何工作

我得到正確的輸出,但我有2個問題:

1)爲什麼我們不能用toStrings1.toString()

2)如果我寫if(s1.equals(s2))而不是僅僅使用if條件的被跳過,直接else條件在輸出中運行,爲什麼呢?

+1

1:S1已經是一個字符串。你仍然可以使用s1.toString(),但那是相當多餘的。 2. s2不是字符串。一個字符串(s1)不能等於不是字符串(s2)的東西,因此你必須首先轉換s2。 –

+1

我試圖編輯這個問題,但仍然沒有真正理解第二個問題: - | – notyou

+1

@JamesMacca,但如果你讀到這個問題,它是工作,問題不是關於Palindrom,而是關於'String'和'StringBuffer'。 – AxelH

回答

0

在你的情況下,s1是一個字符串,s2是StringBuffer。

如果此實例等於參數,則Object類的equals方法返回true。這就是爲什麼你s1.equals(s2)爲false。

但是,如果你將S2轉換爲一個字符串,那麼這將給出真正的價值。因爲字符串生成器的toString()方法將返回字符串值。所以請閱讀String和StringBuffer和StringBuilder的區別。

和toString()。 Object類的equals()和hashCode()方法。

0

首先,不要使用new String()創建新的String對象。字符串是特殊的對象,你不應該用new關鍵字實例化它們,而是利用字符串常量池如下:

String s1 = "value"; // with value assignment 
String s2; // without value assignment 

現在,這是閃開,讓我給你的問題。

[1]您可以對字符串對象使用.toString(),但您爲什麼?將字符序列「轉換」爲字符序列沒有意義。 [2]如果我理解你的問題,在測試過程中,你最有可能輸入一個以大寫字母開頭的單詞,所以如果你輸入Rotor並且你的程序反轉它,結果爲rotoR,而這些兩個字符串是不是相等。 String#toLowerCase消除了這個問題。

我已經改善你的代碼:

String text; 

Scanner sc = new Scanner(System.in); 
System.out.println("Enter your message:"); 
text = sc.nextLine().toLowerCase(); 

String reversedText = new StringBuilder(text).reverse().toString(); 

if (text.equals(reversedText)) { 
    System.out.println("Congratulations, it's a palindrome!"); 
} else { 
    System.out.println("Just another plain normal String..."); 
}