我制作了一个应该清理String
的方法。它必须删除覆盖范围为[a,z]
的每个字符。
但是我得到了这个例外:StringIndexOutOfBoundsException
。
当我插入一个超出条件范围的数字时,会弹出此异常。
我无法发现我做错了什么。
public static String kuisStringOp(String str){
StringBuilder strb = new StringBuilder(str);
for (int i = 0; i < str.length(); i++) {
if(strb.charAt(i)<'a'||strb.charAt(i)>'z'){
strb.deleteCharAt(i);
}
}
return strb.toString();
}
答案 0 :(得分:4)
您正在浏览原始字符串的整个长度,但是您要删除StringBuilder
中的某些字符。删除字符后,StringBuilder
比原始String
短,内容已移至覆盖已删除的字符。在到达原始StringBuilder
的末尾之前,您最终会在String
的末尾结束。
更改for
循环条件以检查StringBuilder
的长度,如果删除了某个字符,则另一个字符现在就位。通过递减i
:
for (int i = 0; i < strb.length(); i++) {
if(strb.charAt(i)<'a'||strb.charAt(i)>'z'){
strb.deleteCharAt(i);
i--;
}
}
答案 1 :(得分:1)
如果您要循环str
但要从strb
删除,则需要执行
保留两个索引/指针,一个到str
,一个到strb
。
试试这个。
public class Test015 {
public static void main(String a[]) throws Exception {
String z = "111aaaa2222bbb";
System.out.println(kuisStringOp(z));
}
public static String kuisStringOp(String str){
StringBuilder strb = new StringBuilder(str);
int i = 0;
int j = 0;
for (i = 0; i < str.length(); i++) {
if(strb.charAt(j)<'a'||strb.charAt(j)>'z'){
strb.deleteCharAt(j);
}else{
j++;
}
}
return strb.toString();
}
}
答案 2 :(得分:1)
使用
for (int i = 0; i < strb.length(); i++) {
就删除缓冲区中的字符而言,您需要在下一次迭代之前检查其长度。
答案 3 :(得分:0)