抛出了意外的StringIndexOutOfBoundsException?

时间:2017-09-13 07:24:53

标签: java string stringbuilder

我遇到了一个问题,如果相邻的字符具有相同的值,我必须从字符串中删除字符。这是我的代码:

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);
    }
}

我检查并重新检查无效指数,但找不到。有人帮我查明何时以及如何退出允许的指数?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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++)