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

StringBuilder deleteCharAt() function " String index out of range : 6 "

Code and Error

Error 2

嘿伙计们看到图像并帮助我解决这个问题

这是第一个代码,它运行完美,但是当我在 blow 代码中使用相同的方法时,它有一些错误 " 错误详情打开图片 link "

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

问题是您正在使用 for 循环,而您实际上同时是 changing/mutating 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 的实际长度。

Samarath,你既修改了字符串又增加了计数器。 这是错误的。考虑字符串 "aaaa" 这就是您的代码所做的:

i = 0: 你找到重复的,删除它。字符串变为 "aaa"。 然后你推进位置:i变成1

i = 1:字符串为"a|aa"(竖线表示位置)。 你在位置 1 找到重复项。你杀死它,字符串 变成了"aa",但是你又把位置往前推了一个:i变成了2

在这一步 for 循环结束,您的字符串是 "aa".

算法应该使用 while 循环:"while there are duplicates, kill them!"

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