2014-09-13 164 views
1
public static int preaparePatternForJFugue(ArrayList <String> arrLst) { 

    String contents; 
    for(int loopIndex2=0;loopIndex2<arrLst.size();loopIndex2++) { 
     contents=arrLst.get(loopIndex2); 
     contents=contents.replaceAll(",", "Q"); 
     arrLst.set(loopIndex2, contents); 
    } 
} 

有沒有可能優化上述代碼?代碼基本上用於查找和替換字符串的ArrayList內的字符串。我們是否有任何提議可以直接在ArrayList內找到並替換,而不必先取得字符串,然後更換?查找並替換爲字符串ArrayList

對於cource,我們可以將最後3行組合在一起,如下所示。但是這隻會節省我猜測的代碼行數。

arrLst.set(loopIndex2, arrLst.get(loopIndex2).replaceAll(",", "Q")); 
+1

如果你想用另一個字符替換一個字符,那麼一個改進可能是使用replace(',','Q')'而不是'replaceAll(「,」,Q「)',這將不必要地涉及到正則表達式引擎。也不需要像loopIndex2這樣命名循環索引,簡單的'i'就足夠了。 「有沒有可能優化上面的代碼?」如果你的代碼有效,那麼你應該在http://codereview.stackexchange.com/上提問這個問題。 – Pshemo 2014-09-13 18:20:23

+2

一個不可變對象的列表不能被更新,除了通過get-change-set範例, – laune 2014-09-13 18:24:09

+0

Laune,所以如果我們使用StringBuilder而不是Strings,我們可以做到內聯?所以方法參數可能需要更改爲ArrayList arrLst。不知道它是否有效。讓我嘗試。 – 2014-09-13 18:33:33

回答

3

你可以編譯Pattern,然後使用MatcherreplaceAll()

Pattern p = Pattern.compile(","); 
for (int loopIndex2 = 0; loopIndex2 < arrLst.size(); loopIndex2++) { 
    Matcher matcher = p.matcher(arrLst.get(loopIndex2)); 
    arrLst.set(loopIndex2, matcher.replaceAll("Q")); 
} 
+0

如果我們使用模式匹配器,任何性能改進? – 2014-09-13 18:34:43

+0

@MaheshaPadyana我相信如此,但它可能取決於您的平臺和版本。 – 2014-09-13 18:38:31

+0

@ElliottFrisch:無論如何,'replaceAll'就是這樣。所以我不認爲有任何區別 – Cratylus 2014-09-13 19:00:12

2

有不同的方法來改善這一點。當然,你需要決定你可以做什麼權衡:

  1. 如果使用正則表達式的字符串很小會增加太多的開銷。你 可以首先檢查該字符是否是目標的一部分,並跳過它 如果不是if(!contents.contains(",")){next;}這通過您的字符串循環 這對於小字符串它並不壞。如果 字符串很小,您還可以自己掃描字符串,並將「就地」替換爲 (因爲字符串不可變,因此您需要創建一個新字符串,但您明白了)。
  2. 如果字符串足夠大,則正則表達式可能是一個選項,因此請遵循@Elliott Frisch的 答案,並在循環內保存 模式的不斷創建。
  3. 你沒有解釋你爲什麼要用逗號添加字符串。 你可以創建一個你的列表的包裝和添加你可以去掉不需要的字符 之前將它們添加到列表本身。在 的相同想法,你可以通過將它們的位置推到另一個數據結構,例如用逗號將這些字符串「標記」到另一個數據結構。一個堆棧,以便在 循環中,您不需要遍歷整個列表,而是直接跳到 並替換它們。如果列表 非常大,這可能會有所幫助。

當然,您需要測試以驗證所有情況。如果你的數據集非常小,而且你沒有真正的需求,那麼編寫最簡單,最直接的代碼。