【问题标题】:delete a substring from a string buffer using Java使用 Java 从字符串缓冲区中删除子字符串
【发布时间】:2023-03-03 12:03:01
【问题描述】:

我想在每次出现这个子字符串时从字符串缓冲区中删除一个子字符串,到目前为止我所做的是:

  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 行中的错误。 有什么想法吗?

【问题讨论】:

  • 你考虑过只使用 String#replaceAll(String old, String new") 吗? text.replaceAll("Alice", "");
  • strbuf 什么时候会成为null?您的 while 循环将永远存在。

标签: java stringbuffer


【解决方案1】:

您的问题是您试图删除一个不存在的子字符串(在您删除它的所有实例之后)。您必须将循环边界更改为类似

while(strbuf != null && strbuf.indexOf(substr) != -1)

【讨论】:

    【解决方案2】:

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

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

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

    以这种方式改变你的循环

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

    【讨论】:

      【解决方案3】:

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

      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());
          }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2013-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-20
            • 1970-01-01
            • 1970-01-01
            • 2016-08-28
            相关资源
            最近更新 更多