Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java while循环内stringbuilder的StringIndexOutOfBoundsException错误_Java - Fatal编程技术网

Java while循环内stringbuilder的StringIndexOutOfBoundsException错误

Java while循环内stringbuilder的StringIndexOutOfBoundsException错误,java,Java,例如,赋值是从字符串“I am Sam am I Sam”中删除字符“a”,这是我到目前为止的位代码: public String removeLetters() { String cleaned=sentence; StringBuilder builder = new StringBuilder(cleaned); while(cleaned.indexOf(lookFor) != -1) { builder.deleteCharAt(cleaned

例如,赋值是从字符串“
I am Sam am I Sam
”中删除字符“
a
”,这是我到目前为止的位代码:

public String removeLetters() {
    String cleaned=sentence;
    StringBuilder builder = new StringBuilder(cleaned);

    while(cleaned.indexOf(lookFor) != -1) {
        builder.deleteCharAt(cleaned.indexOf(lookFor));
    }
    return builder.toString();
}
当没有while循环时(虽然它只删除一个字符),此方法返回的结果很好,但是当我使用while循环运行它时,会出现
边界外错误。

更改此选项:

while(cleaned.indexOf(lookFor) != -1) {
    builder.deleteCharAt(cleaned.indexOf(lookFor));
}
为此:

while(builder.indexOf(Character.toString(lookFor)) != -1) {
    builder.deleteCharAt(builder.indexOf(Character.toString(lookFor)));
}

您可以使用以下方法直接执行此操作:


while
循环中的条件是
已清理的
StringBuilder
中的索引,但随后您使用相同的索引从
builder
中删除字符-删除第一个字符后,它们不再匹配

简言之:

public String removeLetters() {
    String cleaned=sentence;
    StringBuilder builder = new StringBuilder(cleaned);

    while(builder.indexOf(lookFor) != -1) {
        builder.deleteCharAt(builder.indexOf(lookFor));
    }

    return builder.toString();
}
试试这个

cleaned.replaceAll(lookFor,"");

必须从生成器中删除,而不是从源字符串中删除。此外,您最初有一个无限循环,试图修改生成器字符串,但只检查源字符串,这不会改变。这篇文章编译并运行良好:

public String removeLetters()
{
    String lookFor = "a";
    String original="I am Sam am I Sam";
    StringBuilder builder = new StringBuilder(original);
    while(builder.indexOf(lookFor) != -1) {
        builder.deleteCharAt(builder.indexOf(lookFor));
    }
    return builder.toString();
}

我认为您应该使用replaceall而不是replace.OP想要更改a@MelihAltıntaş
替换
仅替换所有出现的内容
replaceAll
用于正则表达式替换。这是唯一的区别。谢谢,对不起我的错误认识:)我已经投票了:)@MelihAltıntaşNo probles.)成功了!谢谢你,现在开始试着去理解为什么,但那是另一天。再次感谢!编辑:原来我只是不知道字符类是什么。您一定已经这样做了,但无论如何,请注意,正如其他成员所提到的,我更改了
builder
cleaned
引用
Character.toString()
只是一种将字符(在Java中被视为数值)转换为字符串的实用方法。
public String removeLetters()
{
    String lookFor = "a";
    String original="I am Sam am I Sam";
    StringBuilder builder = new StringBuilder(original);
    while(builder.indexOf(lookFor) != -1) {
        builder.deleteCharAt(builder.indexOf(lookFor));
    }
    return builder.toString();
}