2017-09-13 65 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));