抛出意外的 StringIndexOutOfBoundsException?
Unexpected StringIndexOutOfBoundsException thrown?
我正在做一个问题,如果相邻字符具有相同的值,我必须从字符串中删除字符。这是我的代码:
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);
}
}
我检查并重新检查了无效索引,但找不到 one.Can 有人帮我找出我何时以及如何超出允许的索引?
正如 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));
主要问题是您正在对一个变量进行操作并对另一个变量执行检查
参见:
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++)
我正在做一个问题,如果相邻字符具有相同的值,我必须从字符串中删除字符。这是我的代码:
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);
}
}
我检查并重新检查了无效索引,但找不到 one.Can 有人帮我找出我何时以及如何超出允许的索引?
正如 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));
主要问题是您正在对一个变量进行操作并对另一个变量执行检查 参见:
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++)