2012-07-25 114 views
0

我試圖做一個程序,它可以找到迴文數(它必須是兩個3位數的產品,我希望它包含6位數字,但它並不重要)。這裏是我的代碼:java字符串 - 字符串索引超出範圍,charAt

public class palindromicNumber { 
    public static void getPalindromicNumber() { 
     boolean podminka = false; 
     int test; 
     String s; 
     for (int a = 999; podminka == false && a > 100; a--) { 
      for (int b = 999; podminka == false && b > 100; b--) { 
       test = a * b; 
       s = Integer.toString(test); 
       int c = 0; 
       int d = s.length(); 
       while (c != d && podminka == false) { 

        if (s.charAt(c) == s.charAt(d)) { // I think that problem is here but I can't see what 
         System.out.println(s); 
         podminka = true; 
        } 
        c++; 
        d--; 
       } 
      } 
     } 
    } 
} 

,如果我想編譯:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6 
at java.lang.String.charAt(String.java:695) 
at faktorizace.palindromicNumber.getPalindromicNumber(palindromicNumber.java:24) 
at faktorizace.Faktorizace.main(Faktorizace.java:19) 

Java結果:1

回答

1

字符串指標去從[0..length - 1]

變化int d = s.length();int d = s.length() - 1;

更新:作爲一個快速之外,要設置podminkatrue

s.charAt(c) == s.charAt(d)

如果s = 100101例如,你將終止所有的循環對while循環的第一次迭代,因爲第一個和最後一個字符是相同的。

+0

嘎,捱打。 XD – 2012-07-25 16:35:55

+1

當您更改'd'更新與此變量相關的代碼時。比如比較和條件運算符涉及這個變量。 – 2012-07-25 16:37:10

+0

Ouuu,那是我正在尋找的錯誤。當我知道我必須看的地方時,很容易找出它。 :D – United121 2012-07-25 18:30:40

0

int d = s.length();

字符串字符數組將只從0 - 長度-1。

s.charAt(d)在第一次迭代中將總是出界。

2

有兩個問題在這裏:

  • 你開始了與錯誤的上限,因爲其他的答案也提到
  • 如果c開始了奇數和d開始了偶數,則c從不等於d。您需要使用

    while (c < d && !podminka) // Prefer !x to x == false 
    

此外,明智地使用breakreturn會避免你不得不有podminka可言。

由於另一個撇開,你有一個關注問題的分離。你的方法目前做了三兩件事:對數字

  • 迭代以特定方式
  • 檢查他們是否是palandromic
  • 打印它最先找到

你應該把這些分開了。例如:

public void printFirstPalindrome() { 
    long palindrome = findFirstPalindrome(); 
    System.out.println(palindrome); 
} 

public long findFirstPalindrome() { 
    // Looping here, calling isPalindrome 
} 

public boolean isPalindrome(long value) { 
    // Just checking here 
} 

我懷疑findFirstPalindrome通常也需要一些參數。在這一點上,你會有方法,寫和測試都會更容易一些。

+0

我怎樣才能找到最大的迴文?我試過每個迴文數字都到數組和佈雷類,然後我調用數組[0],但編譯器沒有給我結果(它沒有給我任何東西:D)你有任何解決方案或想法嗎? – United121 2012-07-26 17:27:20

+0

@ user1551954:一次有一個問題......這聽起來像是一個單獨的問題,所以請在閱讀http://tinyurl.com/so-hints後詢問一個新問題 – 2012-07-26 17:33:45

0

就以JDK的源代碼來看看:

public char charAt(int index) { 
    if ((index < 0) || (index >= count)) { 
     throw new StringIndexOutOfBoundsException(index); 
    } 
    return value[index + offset]; 
} 

你可以看到,當指數小於零或超過字符串的長度則拋出該異常。現在使用調試器,調試你的代碼,看看爲什麼你將這個錯誤的參數值傳遞給charAt()

+1

你說超過,你是不是認爲會見或超過?畢竟,「hello」.charAt(5)不會超過長度,但會因爲符合長度而引發異常。 – corsiKa 2012-07-25 16:41:26

0
 public class palindromicNumber { 
      public static void getPalindromicNumber(){ 
       boolean podminka = false; 
       int test; 
       String s; 
      for(int a = 999;podminka == false && a>100; a--){ 
       for(int b = 999;podminka == false && b>100; b--){ 
       test = a*b; 
       s = Integer.toString(test); 
       int c = 0; 
       int d = s.length(); 
       while(c!=d && podminka == false){       

        if(s.charAt(c)==s.charAt(d - 1)){ 
        System.out.println(s); 
         podminka = true;         
       } 
         c++; 
         d--; 
       } 
        } 

}

試試這個!字符串數從0開始!

+1

你的內部循環對於諸如123的數字有什麼作用? – 2012-07-25 16:42:44

+0

我試過了,錯誤消失了,但結果並不令人滿意(錯誤:D)。當我開始時,我得到了這個:990009,但它不是迴文數字。你有任何解決方案? – United121 2012-07-25 17:35:39

+0

@ user1551954:考慮's = 990009'時算法會發生什麼。遵循邏輯。 – 2012-07-25 17:53:49

相關問題