1

この部分文字列が発生するたびに、文字列バッファーから部分文字列を削除したいのですが、これまでに行ったことは次のとおりです。

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

「アリス」をすべて削除したい。しかし、次のエラーが発生します。

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

while行のエラーだと思います。何か案は?

4

5 に答える 5

3

あなたの問題は、そこにない部分文字列を削除しようとしていることです(そのすべてのインスタンスを削除した後)。ループ境界を次のように変更する必要があります

while(strbuf != null && strbuf.indexOf(substr) != -1)
于 2012-04-12T19:29:59.270 に答える
2

にreturnが含まれてtextいない場合、で呼び出すためです。substrindexOf-1delete-1

その後、あなたのループはstrbufisまで続きます!= null:それは永遠です。

あなたの場合、すべてのsubstr出現を削除すると例外がスローされ、次のindexOfリターンが返されます-1

このようにループを変更します

int i;
while ((i = strbuf.indexOf(substr)) != -1)
    strbuf.delete(i, i + substr.length());
于 2012-04-12T19:29:38.397 に答える
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());
    }
于 2012-04-12T19:29:54.327 に答える
0

文字列が見つからないため、-1 が返されます。条件を変更して、最初に文字列が見つかったかどうかを確認してから、削除してみてください。

于 2012-04-12T19:30:06.083 に答える
0

これは、stringbuffer から文字列 "Alice" を削除すると、再び見つけることができなくなるためです。したがって、indexOf() メソッドは -1 を返すため、java.lang.StringIndexOutOfBoundsException を取得します。

于 2012-04-12T19:33:56.590 に答える