2012-04-12 59 views
1

我想刪除一個字符串的子緩存每到這個子occures時間的字符串緩衝區刪除子,我做了什麼至今:從使用Java

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行的錯誤。 任何想法?

+3

你有沒有考慮過使用String#replaceAll(String old,String new「)?text.replaceAll(」Alice「,」 「); – 2012-04-12 19:29:15

+0

什麼時候'strbuf'會被'null'?你的while循環會永遠持續下去。 – Danny 2012-04-12 19:32:43

回答

3

你的問題是你試圖刪除不存在的子字符串(在你刪除了它的所有實例後)。你必須改變你的循環邊界喜歡的東西

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

因爲如果text不包含substrindexOf回報-1,你叫delete-1

然後你的循環繼續,直到strbuf!= null那就是永遠

在你的情況下,當你刪除所有substr事件並且下一個indexOf返回-1時它會拋出一個異常。

更改循環以這種方式

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

您應該檢查串是否是你的字符串

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

的一部分,這絕不會是假使循環是endlesss

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

你得到一個-1,因爲該字符串不再發現,你需要改變的條件檢查如果您已經找到字符串,然後嘗試刪除它

0

這是因爲一旦你從你的stringbuffer刪除字符串「Alice」,你將無法再次找到它!所以你的indexOf()方法將返回-1,因此你將得到java.lang.StringIndexOutOfBoundsException