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

代码和错误

错误2

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

它是第一个代码并且它运行完美但是当我在吹码中使用相同的方法时它有一些错误“For error detail open image 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循环而你实际上是在同时更改/变换StringBuilder实例,所以.length()将不会被修复,最终你将尝试在for循环中达到不存在的索引,exception将被抛出

编辑:

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

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

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

萨马拉特,你们都修改了字符串并推进了计数器。 这是错的。 考虑字符串“aaaa”这是您的代码所做的:

i = 0:您找到重复的内容,将其删除。 字符串变成“aaa”。 然后你提升位置:我变成1

i = 1:字符串是“a | aa”(垂直条表示位置)。 你找到位置1的副本。你杀了它,字符串变成“aa”,但你再次前进一个位置:我变成了2

在这一步, for循环结束,你的字符串是“aa”。

相反,算法应该使用while循环:“当有重复时,杀死它们!”

 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