2017-09-13 64 views
0

我在做一個問題,如果相鄰的字符具有相同的值,我必須從字符串中刪除字符。這是我的代碼:意外的StringIndexOutOfBoundsException拋出?

import java.util.Scanner; 
public class SuperReducedStringRe { 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     String str = in.next(); 
     StringBuilder s = new StringBuilder(str); 
     char[] ch = str.toCharArray(); 

     for(int i = 0;i < str.length()-1; i++) { 
      if(s.charAt(i) == s.charAt(i+1)) { 
       s.delete(i,i+2); 
       i=-1; 
      } 
     } 
     System.out.print(s); 
    } 
} 

我檢查並重新檢查無效的指標,但無法找到one.Can有人能幫我找出什麼時候和怎麼我出去允許的指數?

+3

提示:如果您刪除從'StringBuilder'一些字符,它長的不一樣,因爲它是。假設你以「xxxxxxxxxxx」開始......你仍然會循環10次,但最終你的StringBuilder將不夠長。您應該能夠通過在調試器中小心翼翼地看到這一點。 –

+1

堆棧跟蹤在哪裏?使用調試器Luke ... –

回答

0

的主要問題是,你在一個變量操作和另一變量 見執行檢查:

for(int i=0;i<str.length()-1;i++) // performing a check on str, whereas 

s.delete(i,i+2); // updating s(deleting the char from s) 

更改

for(int i=0;i<str.length()-1;i++) 

for(int i=0;i<s.length()-2;i++) 
+0

感謝您的幫助。我錯過了我正在檢查str.length() - 1。關於第二點,我認爲我

+0

@AkhilRanjan你是對的。我錯過了刪除第二個arg是獨佔不包含的事實。如果解決了問題,您也可以將答案標記爲「已接受」。 – theLearner

1

正如JonSkeet指出的那樣,您忽略了從StringBuilder刪除的事實減少了它的長度。

相反的:

for(int i=0;i<str.length()-1;i++){ 

使用

for(int i=0;i<s.length()-1;i++){ 

但對於ch?你永遠不會使用它。而你並不需要使用StringBuilder,你可以直接在陣列上運行:

int dst = 0; 
int src = 0; 
while (src < ch.length) { 
    // Keep the character at src. 
    ch[dst] = ch[src++]; 

    // Skip past all adjacent characters which are the same. 
    while (src < ch.length && ch[src] == ch[dst]) { 
    ++src; 
    } 

    // Move the dst pointer along, so the next char we keep doesn't overwrite the previous. 
    ++dst; 
} 
// Now build a string from the first dst characters in ch. 
System.out.println(new String(ch, 0, dst));