StringBuilder deleteCharAt()函数"字符串索引超出范围:6"

时间:2017-12-03 19:51:59

标签: java string stringbuilder

Code and Error

Error 2

嘿,伙计们看到了这张图片并帮我解决了这个问题

这是第一个代码,它运行得很好但是当我在打击代码中使用相同的方法时它有一些错误 "有关错误详情,请打开图片链接"

String str = "Samaarth";
StringBuilder sb = new StringBuilder(str);
sb.deleteCharAt(3);
System.out.println(sb.toString());

这是错误开始和错误是由于DeleteCharAt()函数,但在上面的代码中这个函数完美地工作,但在这里它不是 IDK为什么这样请帮我解决这个问题

String str= "aaabccddd";

StringBuilder sb = new StringBuilder(str);

for (int i = 0; i < str.length() -1; i++) {
    if (sb.charAt(i) == sb.charAt(i + 1)) {
        sb.deleteCharAt(i);
        //sb.deleteCharAt(i+1);
    }
}

System.out.println(sb.toString());

2 个答案:

答案 0 :(得分:2)

Samarath,你们都修改了字符串并推进了计数器。 这是错的。考虑字符串&#34; aaaa&#34; 这就是您的代码所做的事情:

i = 0:您找到副本,将其删除。字符串变为&#34; aaa&#34;。 然后你提升位置:我变成1

i = 1:字符串是&#34; a | aa&#34; (垂直条显示位置)。 你在位置1找到副本。你杀了它,字符串 变成&#34; aa&#34;,但你再次推进一个位置:我变成2

在此步骤中,for循环结束,您的字符串为&#34; aa&#34;。

相反,算法应该使用while循环:&#34;当有重复时,杀死它们!&#34;

String str= "aaabccddd";

StringBuilder sb = new StringBuilder(str);

int i = 0;
while (i < sb.length()-1) {
    if (sb.charAt(i) == sb.charAt(i + 1)) {
        sb.deleteCharAt(i);
        // Do not increment -- kill all duplicates
    } else {
        // Either not a duplicate, or all duplicated killed
        // Advance one char
        i++;
    }
}
System.out.println(sb.toString());

输出为abcd

如果您倾向于使用for循环,则按相反的顺序迭代:

String str= "aaabccddd";
StringBuilder sb = new StringBuilder(str);

for (int i = sb.length()-1; i > 0; i--) {
    if (sb.charAt(i) == sb.charAt(i - 1)) {
        // Note charAt(i - 1) - we compare with the preceding character
        sb.deleteCharAt(i);
        // The string squeezes by one char, but the decremented position
        // will follow
    } 
}
System.out.println(sb.toString());

输出为abcd

答案 1 :(得分:0)

问题是你正在使用for循环而你实际上是在同时更改/变异StringBuilder实例,所以.length()不会被修复,最终你会尝试在for循环中到达不存在的索引并且将抛出异常。

编辑:

在调用deleteCharAt()方法之前,在for循环if语句中添加这两行:

System.out.println("Value of i is: " + i);
System.out.println("StringBuilder length is: " + sb.length());

“i”表示您要删除的索引,sb.length()将显示StringBuilder的实际长度。