2013-02-22 56 views
1

我想檢查是否一個字符串,輸入的字符串,該字符串是迴文檢查迴文(JAVA)(新秀狀態)

,如果它是顯示一些積極 如果不.. (無效)

我目前得到的答案無效(無論輸入什麼內容) 我不太確定如果for循環或布爾語句有問題。

//ACTION FROM BUTTON PERFORMED HERE 
private void ButtonActionPerformed(ActionEvent evt) { 
    //creating variables 
    String myString = textField1.getText(); 
    int stringLength = myString.length(); 
    char arrayOne[] = new char[stringLength]; 
    char arrayTwo[] = new char[stringLength]; 
    boolean palindrome = false; 

    //for loop to setup ARRAY ONE 
    for(int i = 0; i < stringLength-1; i++){ 
     arrayOne[i] = myString.charAt(i); 
    } 

    //for loop to setup ARRAY TWO 
    for(int i = stringLength-1; stringLength-1 > i; i--){ 
     arrayTwo[i] = myString.charAt(i); 
    } 

    //for loop checking if array indexes are equivalent in value (char) 
    for(int i = 0; i < stringLength-1; i++){ 
     if(arrayOne[i] != arrayTwo[i]){ 
      palindrome = false; 
     } 
     else{ 
      palindrome = true; 
     } 
    } 

    //assigning text to the text boxes based on boolean palindrome 
    if(palindrome == true){ 
     textField2.setText("Valid"); 
    } 
    if(palindrome ==false){ 
     textField2.setText("Invalid"); 
    } 
} 

}

我想我評論它descently

+1

可以使用調試器或添加調試代碼。 – 2013-02-22 06:17:09

+0

http://stackoverflow.com/questions/4138827/check-string-for-palindrome?rq=1 – 2013-02-22 06:29:22

回答

3

變化

for(int i = stringLength-1; stringLength-1 > i; i--) 

for(int i = 0; i < stringLength-1; i++) 

,改變

for(int i = stringLength-1; i-1 > 0; i--) 

for(int i = stringLength-1; i-1 >= 0; i--) 

編輯:

這是巨星調試!!

這裏是一個工作代碼:

//for loop to setup ARRAY ONE 
for(int i = 0; i < stringLength-1; i++){ 
    arrayOne[i] = myString.charAt(i); 
} 

這也許應該是固定的這樣:

String myString = textField1.getText(); 
    int stringLength = myString.length(); 
    char arrayOne[] = new char[stringLength]; 
    char arrayTwo[] = new char[stringLength]; 
    boolean palindrome = true; 
    //for loop to setup ARRAY ONE 
    for(int i = 0; i <= stringLength-1; i++){ 
     arrayOne[i] = myString.charAt(i); 
    } 

    //for loop to setup ARRAY TWO 
    for(int i = stringLength-1, pos = 0; i >= 0; i--, pos++){ 
     arrayTwo[pos] = myString.charAt(i); 
    } 

    //for loop checking if array indexes are equivalent in value (char) 
    for(int i = 0; i <= stringLength-1; i++){ 
     if(arrayOne[i] != arrayTwo[i]){ 
      palindrome = false; 
      break; 
     } 
    } 

    //assigning text to the text boxes based on boolean palindrome 
    if(palindrome == true){ 
      textField2.setText("Valid"); 
    } 
    else{ 
     textField2.setText("Invalid"); 
    } 
+0

如果'stringLength'大於1,這將是無限循環,因爲'stringLength'在循環內永遠不會改變。 – 2013-02-22 06:19:41

+0

如果將「> i」更改爲「> 0」 – 2013-02-22 06:20:06

+0

@LeeHurlbert,則會出現錯誤「字符串索引超出範圍」 正確。不是無限的,因爲它會以異常結束:) – 2013-02-22 06:20:59

1

這個循環複製所有除了最後一個這可能不是你想要的字符

//for loop to setup ARRAY ONE 
for(int i = 0; i < stringLength; i++) 
{ 
    arrayOne [i] = myString.charAt (i); 
} 

本循環體:

//for loop to setup ARRAY TWO 
for (int i = stringLength-1; stringLength-1 > i; i--) 
{ 
    arrayTwo [i] = myString.charAt (i); 
} 

永遠不會執行,因爲初始值爲istringLength - 1不滿足循環條件:stringLength - 1 > i

你或許應該改變它是:

// For loop to setup ARRAY TWO 
for (int i = 0; i < stringLength; i++) 
{ 
    arrayTwo [i] = myString.charAt (stringLength - i - 1); 
} 

而且,這個循環之後:

// for loop checking if array indexes are equivalent in value (char) 
for (int i = 0; i < stringLength-1; i++) 
{ 
    if (arrayOne [i] != arrayTwo [i]) 
    { 
     palindrome = false; 
    } 
    else 
    { 
     palindrome = true; 
    } 
} 

變量palindrome將只包含最後比較的結果,因此,如果除了最後的所有字符不同但最後的字符相同,palindrome將是true這可能不是你想要的。也許你應該改變這樣的代碼:

palindrome = true; 
for (int i = 0; i < stringLength; i++) 
{ 
    if (arrayOne [i] != arrayTwo [i]) 
    { 
     palindrome = false; 
    } 
} 

請注意,我也改變stringLength - 1stringLength,否則你忽略了最後一個字符。

+0

我看 - 那麼如果我要改變第二部分「stringLegnth-1>我」到「我> 0」它會滿足條件或使它永遠真實 – 2013-02-22 06:27:22

1
//for loop to setup ARRAY TWO 
for(int i = stringLength-1; stringLength-1 > i; i--){ 
    arrayTwo[i] = myString.charAt(i); 
} 

在第一次迭代之後,這會發生。

你需要改變它的東西,如:

//for loop to setup ARRAY TWO 
for(int i = stringLength-1; i > 0; i--){ 
    arrayTwo[i] = myString.charAt(i); 
} 
+0

非常感謝!工作完美,我意識到我的錯誤 – 2013-02-22 06:24:31

0

最簡單的方法在Java

String str = "Able was I ere I saw Elba" 
boolean palindrome = str.equalsIgnoreCase(new StringBuilder(str).reverse().toString()); 

沒錯來測試迴文,僅此而已。

+0

我感謝你這^ _ ^但是,{我知道怪異}我實際上試圖寫的方法「檢查反向」感謝壽! – 2013-02-22 06:24:02

+0

也許也應該修剪()它 – gandolf 2013-02-22 06:24:49

+0

最簡單,是的,最有效的,沒有 – bowmore 2013-02-22 06:27:08

0
public static void main(String[] args) { 
    String s = "akaq"; 
    boolean b = false; 
    for (int i = 0, j = s.length() - 1; i < j; i++, j--) { 
     if (s.charAt(i) == s.charAt(j)) { 
      b = true; 
      continue; 
     } else { 
      b = false; 
      break; 
     } 
    } 
    if (b) 
     System.out.println("Palindrome"); 
    else 
     System.out.println("Not Palindrome"); 
} 

試試這樣的而不是2-3的循環。

2

我同意你的錯誤其他的答案,但我認爲一個更簡潔的解決方案將是

boolean isPalindrome(String myString) {  
    int n = myString.length; 
    for(int i = 0; i < n/2; i++) 
     if (myString.charAt(i) != myString.charAt(n-i-1)) return false; 
    return true;  
} 

您的代碼將現在是

private void ButtonActionPerformed(ActionEvent evt) { 
    String myString = textField1.getText();  
    textField2.setText(isPalindrome(myString) ? "Valid" : "Invalid"); 
} 
+0

+1最佳答案迄今 – 2013-02-22 06:27:15

+0

我絕對喜歡這個 - 但它沒有陣列,我應該單獨調用這個 – 2013-02-22 06:30:50

+0

你不'根本不需要數組。無論如何,當你可以逐一訪問字符串的字符時,我建議你不要使用它們。 – 2013-02-22 06:33:18

0

更改第一從stringLength-循環1 to stringLength因爲您使用的是<而不是< =

將第二個循環更改爲

if(int i = stringLength-1; i>=0; i--) 

此外,默認設置迴文爲true,併除去

else{ 
    palindrome = true; 
} 

一部分,因爲現在如果循環的第一個和最後一個字符是相同的,但不是中間,它會返回true。

編輯:另外,在第三for循環應該是stringLength而不是stringLength-1,因爲你正在使用<,而不是< =

+0

你的意思是(int i = stringLength-1; i> = 0; i ++) – 2013-02-22 06:28:50

+0

不,因爲那樣我會永遠增加,永遠不會小於0。 – 2013-02-22 06:30:50

0

有沒有需要的一切複製到陣列。字符串基本上是一個數組本身。您可以使用charAt()訪問單個字符。

也不需要循環整個字符串的長度,因爲等號是關聯的。

所以,簡單地使用:

public boolean isPalindrome(String s) { 
    for (int i = 0; i < s.length()/2; i++) {     // only until halfway 
     if (s.charAt(i) != s.charAt(s.length() - i - 1)) {  // accessing characters of String directly 
      return false; 
     } 
    } 
    return true; 
} 

最後一個備註:如果字符串的長度爲奇數,你並不需要檢查中間chracter。所以在上面的代碼中,通過