使用Java从字符串缓冲区中删除子字符串

时间:2012-04-12 19:26:32

标签: java stringbuffer

我希望每次发生这个子字符串时都从字符串缓冲区中删除一个子字符串,到目前为止我做的是:

  public static void main(String[] args) {

        String text = "Alice Bob Alice Bob Alice Bob";
        String substr = "Alice";            
        StringBuffer strbuf = new StringBuffer(text);
        strbuf.indexOf(substr);
        strbuf.lastIndexOf(substr);
        while (strbuf != null) {
                strbuf.delete(strbuf.indexOf(substr), strbuf.indexOf(substr) + substr.length());
                System.out.println(strbuf.toString());
            }
}

我想删除每次出现的“Alice”。但它给出了以下错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

我认为while行中的错误。 有什么想法吗?

5 个答案:

答案 0 :(得分:3)

您的问题是您正在尝试删除不存在的子字符串(在您删除了它的所有实例之后)。你必须将你的循环边界改为像

这样的东西
while(strbuf != null && strbuf.indexOf(substr) != -1)

答案 1 :(得分:2)

因为如果text不包含substr,则indexOf会返回-1,并且您使用delete致电-1

然后你的循环一直持续到strbuf != null永远是

在您的情况下,当您删除所有substr次出现并且下一次indexOf返回-1时,它会抛出异常。

以这种方式改变你的循环

int i;
while ((i = strbuf.indexOf(substr)) != -1)
    strbuf.delete(i, i + substr.length());

答案 2 :(得分:1)

您应该检查子字符串是否是字符串的一部分

int pos = strbuf.indexOf(substr);
if (pos < 0) { // not found...

这永远不会错误,使循环成为无穷无尽的

while (strbuf != null) { ...

更好的版本应该是

    String text = "Alice Bob Alice Bob Alice Bob";
    String substr = "Alice";            
    StringBuffer strbuf = new StringBuffer(text);
    while (true) {
      int pos = strbuf.indexOf(substr);
      if (pos < 0) break; // ready
      strbuf.delete(pos, pos + substr.length());
      System.out.println(strbuf.toString());
    }

答案 3 :(得分:0)

你得到-1因为找不到字符串,你需要更改条件以检查你是否先找到了字符串,然后尝试删除它

答案 4 :(得分:0)

这是因为一旦你从stringbuffer中删除字符串“Alice”,你将无法再找到它!所以你的indexOf()方法将返回-1,因此你将获得java.lang.StringIndexOutOfBoundsException