2016-03-10 30 views
-5

字符串是迴文,如果它以相同的方式向後拼寫並且 向前。jva中的字符串索引超出範圍

迴文的例子包括「雷達」和「該死的,我瘋了!」。

編寫一個java程序,PalindromeTester,要求用戶輸入一個 單詞或句子,然後檢查輸入的字符串是否是 迴文。

空間,nonalphabetics: - ;毫無生氣的傻瓜,孤傲的吟遊詩人 「是 迴文(()\」,並在字符串中的情況下有 被忽略例如,。!?)「。

你的實現應該定義和使用方法isPalindrome到 測試,如果某些字符串是迴文的 isPalindrome方法的簽名如下:。

boolean isPalindrome(String) 

以下是該程序的運行示例用戶的輸入以粗體顯示

java PalindromeTester 
Introduction to Computer Programming (CMPS 200) 
Spring 2015-16 2 of 3 
Enter a string: I love CMPS 200 
The string "I love CMPS 200" is NOT a palindrome. 

這是我做的代碼,它不斷給我一個錯誤。

我想知道我的錯誤,以及是否有後z = z + 1;

編寫這些代碼

import java.util.Scanner; 
public class PalindromeTester { 
    public static void main (String args []) { 
     Scanner console = new Scanner(System.in); 
     System.out.println("Enter a string: "); 
     String palindrome = console.next(); 
     if (isPalindrome (palindrome)) { 
      System.out.print("The string \""+palindrome+" is a palindrome."); 
     } else { 
      System.out.print("The string \""+palindrome+" is NOT a palindrome."); 
     } 
    } 

    public static boolean isPalindrome (String palindrome) { 
     int constant = 1; 
     for (int i = 0 ; i <= (palindrome.length()-1) ; i++) { 
      for (int z= (palindrome.length()-1);i >= 0; i--) { 
       if (palindrome.charAt(i) <'@'||'Z'<palindrome.charAt(i)&&palindrome.charAt(i)<'`'||'['<palindrome.charAt(i)&&palindrome.charAt(i)<'{') { 
        i=i+1; 
       } 
       if (palindrome.charAt(z)<'@'||'Z'<palindrome.charAt(z)&&palindrome.charAt(z)<'`'||'['<palindrome.charAt(z)&&palindrome.charAt(z)<'{') { 
        z=z+1; 
       } 
       if (palindrome.charAt(i)==(palindrome.charAt(z))) { 
        constant = constant * 1; 
       } else { 
        constant = constant * 0; 
       } 
      } 
     } 
     if (constant == 0) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 
+1

請出示你所得到的錯誤。 – Jason

+0

異常在線程 「主」 java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:7 \t在java.lang.String.charAt(未知來源) \t在PalindromeTester.isPalindrome(PalindromeTester.java:23) \t在PalindromeTester.main(PalindromeTester.java:8) 是我得到的錯誤 –

回答

0

索引超出範圍由palindrome.charAt(z))引起保持簡單的更快更簡單的方法:

public static boolean isPalindrome(String palindrome) 
{ 
    palindrome = palindrome.replaceAll("\\W", ""); // remove all non word character 
    palindrome = palindrome.toLowerCase(); 
    int size = palindrome.length(); 
    int halfSize = size/2; 

    for (int i = 0; i < halfSize; i++) 
    { 
     if(palindrome.charAt(i) != palindrome.charAt(size - i - 1)) 
      return false; 
    } 

    return true; 
} 
+0

您的'halfsize'變量存儲了字符串長度的一半,但是您的循環只會減少一半 - 所以您只檢查1/4的字符串。此外,您沒有處理需要忽略的標點和空白字符。 – Jason

+0

循環將在同一時間檢查前半部分和後半部分。爲什麼是1/4? – Opsse

+0

因爲你的循環停在'halfSize/2'處。 – Jason

0

一種方法是將非alpha字符去掉字符串。然後檢查字符串是否相同本身反轉(儘管大寫):

public static boolean isPalindrome(String palindrome) { 
    StringBuilder sanitisedString = new StringBuilder(); 
    for(char c : palindrome.toCharArray()) { 
     if(Character.isLetter(c)) { 
      sanitisedString.append(c); 
     } 
    } 
    return sanitisedString.toString().toUpperCase().equals(sanitisedString.reverse().toString().toUpperCase()); 
} 
+0

我曾考慮過,但刪除它。因此,我已將其添加回來。 – Jason

0

爲什麼不只是做一個新的字符串並保存反轉源(字符串)在其中。

public static boolean readstring(String s) 
{ 
    String b = ""; 
    for (int i= s.length() -1; i >=0 ;i--) 
    { 
     b = b + s.charAt(i); 
    } 
    System.out.print(b +" and "+ s +" "); 
    return b == s || b.Equals(s); 
} 

編輯:但願這符合要求,順便不使用單詞「忽略」,但「允許」

+0

如果有任何標點符號或空格字符,則您的代碼將返回false。這不符合要求。你的代碼應該忽略標點符號和空格,同時決定字符串是否是迴文。 – Jason

+0

是的,再次閱讀,你是對的,改變了上面的代碼,但我不知道它是否仍然符合要求。 – Bargros