2012-10-25 189 views
0

我是java新手,我正在嘗試瞭解如何優化代碼以使其生產就緒。我有下面的代碼。我想知道我可以如何優化它。我想通過使用一小部分的可能,這將是一個很好的學習方式。Java字符串替換

有些觀點:
1.該功能將運行多次,它需要快速。
2.輸入不受約束,因爲它可能來自用戶或來自文件。有沒有辦法處理這個問題,以免引發異常?我正在考慮使用正則表達式。
3.我還需要做些什麼來使其生產準備就緒?例如單元測試。如果是這樣,那麼最好的辦法是什麼?
4.我假設要搜索的字符串不是很長。
5.當我說的優化,我的意思是做這樣的事情的東西取代了「+」運算速度是它可以影響內存和性能等

public String strReplave(String originalStr, String oldStr, String newStr) { 
    int start = 0; 
    while ((start = originalStr.indexOf(oldStr, start)) > 0) { 
     originalStr= originalStr.substring(0,start) + newStr+ originalStr.substring(start + oldStr.length()); 
    start += newStr.length(); 
} 
return originalStr; 
} 

感謝您的幫助,如果你需要我澄清任何事情,請讓我知道。

+1

發佈在http://codereview.stackexchange.com。這是優化代碼的地方。 –

+0

爲了使生產準備就緒,我建議使用內置函數。 – Keppil

+0

爲了讓它生產準備就緒,我建議你查看'StringBuilder'而不是你剛剛發佈的代碼。 –

回答

0
public static String replace(String originalStr, String oldStr, String newStr) { 
    int p = originalStr.indexOf(oldStr); 
    if (p == -1) { 
     return originalStr; 
    } else { 
     StringBuilder result = new StringBuilder(); 
     result.append(originalStr, 0, p); 
     result.append(newStr); 
     int q = p + oldStr.length(); 
     while ((p = originalStr.indexOf(oldStr, q)) != -1) { 
      result.append(originalStr, q, p); 
      result.append(newStr); 
      q = p + oldStr.length(); 
     } 
     result.append(originalStr, q, originalStr.length()); 
     return result.toString(); 
    } 
} 
  • 使用StringBuilder到Concat的字符串。
  • 如果搜索字符串未找到,則進行優化。如果這不會發生,你可以跳過這個。
+0

爲什麼不是'StringBuilder'或'StringBuffer'?或'string.replace()'? –

+0

@nosid:我是Java新手。你能分解代碼在做什麼嗎? – user1775342

1

沒有什麼會打敗內置的方法input.replace(old,new),所以沒有理由嘗試自己重新實現它。

+0

如果字符串非常大,這仍然是最佳的嗎? – user1775342

+0

@ user1775342你說的字符串會更小。 –

+0

@ user1775342查看「StringBuffer」和「StringBuilder」 –

0

兩點:

  1. 有一個的replaceAll和String類一replaceFirst方法(與正則表達式的作品),你可能想使用它。
  2. 代碼中非常低效的一件事是您使用'+'運算符連接字符串。你應該看看StringBuilder類。
0

這是我用:

public static String replaceString(String cadena, String word, String newWord) { 
    Pattern pat = Pattern.compile(word); 
    Matcher mat = pat.matcher(cadena); 
    return mat.replaceAll(newWord); 
} 

你並不真正需要知道的正則表達式來使用它,因爲它會匹配一個字符串,如"a literal string"我不知道這是否就是你要求但對我來說工作得很好。

+0

這會處理不受約束的輸入嗎?輸入可以是任何格式。由於它可能來自用戶,我不確定會導致代碼崩潰的原因。 – user1775342

+0

好吧,如果您不確定用戶是否會使用它,請按照某人的說法使用string.replace。 –

+1

如果你關心的是'String.replace'的實現,它正是這樣做的,但是正確的。不同之處在於接受不成功的字符串。 –

0

除了使用內建函數外,我的兩分錢。使它明顯代碼做什麼。然而,包括你的程序可能失敗的所有可能的條件。

使用try{} catch() {異常處理}

衡量你的代碼,並在瓶頸之前試圖優化代碼。不要猜測。