2015-11-19 103 views
0

我試圖插入for循環到一個Stringbuilder,但它崩潰。這是我的代碼插入for循環失敗

StringBuilder sb = new StringBuilder("This is a text"); 
for(int i = 0;i < sb.length();i++){ 
    if(sb.charAt(i) == 't'){ 
     sb.insert(i, 't'); 
    } 
} 

這樣做的目的是每't'加倍。

+1

什麼錯誤是它給你? – resueman

+5

這會產生一個無限循環,不是嗎?的StackOverflowError?因爲最後一個't'? – Tunaki

+1

爲什麼不使用'String.replace'方法 - http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace%28java.lang.CharSequence,%20java .lang.CharSequence%29? –

回答

7

您將得到一個OutOfMemoryError,因爲您不會跳過t字符,您正在翻倍。

This is a text 
     ^
This is a ttext 
     ^
This is a tttext 
      ^

這會一直持續到內存不足時爲止。

您必須在插入加倍的t之後立即增加i,以跳過t

if (sb.charAt(i) == 't') 
{ 
    sb.insert(i, 't'); 
    i++; 
} 
+0

啊你是對的謝謝!我的愚蠢 –

+3

不客氣。但我只是通過運行代碼來確定錯誤。將來,請包含錯誤/異常消息和堆棧跟蹤。這樣可以更快地診斷問題。 – rgettman

0

您遇到的問題如下。

  1. 遍歷整個列表,從頭到尾。
  2. 如果您發現t請添加t

兩種情況,無論是存在至少1 tString或有沒有。如果沒有,那麼所有的都會工作,代碼什麼都不做。但是如果有一個t它會發現t增加另一個t,下一個要檢查的字符現在是... a t!無限循環。

您可以通過增加iì++)或使用continue來解決問題。

1

我建議使用StringBuilder和字符串這樣的:

String currentText = "This is a text"; 
StringBuilder sb = new StringBuilder(); 
for(int i = 0; i < currentText.length(); i++){ 
    sb.append(currentText.charAt(i)); 
    if(currentText.charAt(i) == 't'){ 
     sb.append('t'); 
    } 
} 

有了這個解決方案,你會不會有問題,永無止境的循環。

0

因爲當你找到一個t該指令sb.insert(i, 't')添加ti位置和以前t成爲i+1位置,所以當i將在for循環與i++末增加你處理其他時間相同的字母t。這樣會造成無限循環。

爲了解決這個問題,你應該在if塊一樣,與i++增加i

if(sb.charAt(i) == 't'){ 
sb.insert(i, 't'); 
i++; 
}