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
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