我試圖插入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'加倍。
我試圖插入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'加倍。
您將得到一個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++;
}
啊你是對的謝謝!我的愚蠢 –
不客氣。但我只是通過運行代碼來確定錯誤。將來,請包含錯誤/異常消息和堆棧跟蹤。這樣可以更快地診斷問題。 – rgettman
您遇到的問題如下。
t
請添加t
。兩種情況,無論是存在至少1 t
在String
或有沒有。如果沒有,那麼所有的都會工作,代碼什麼都不做。但是如果有一個t
它會發現t
增加另一個t
,下一個要檢查的字符現在是... a t
!無限循環。
您可以通過增加i
(ì++
)或使用continue
來解決問題。
我建議使用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');
}
}
有了這個解決方案,你會不會有問題,永無止境的循環。
因爲當你找到一個t
該指令sb.insert(i, 't')
添加t
在i
位置和以前t
成爲i+1
位置,所以當i
將在for
循環與i++
末增加你處理其他時間相同的字母t
。這樣會造成無限循環。
爲了解決這個問題,你應該在if
塊一樣,與i++
增加i
:
if(sb.charAt(i) == 't'){
sb.insert(i, 't');
i++;
}
什麼錯誤是它給你? – resueman
這會產生一個無限循環,不是嗎?的StackOverflowError?因爲最後一個't'? – Tunaki
爲什麼不使用'String.replace'方法 - http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace%28java.lang.CharSequence,%20java .lang.CharSequence%29? –