2015-11-02 33 views
1

對不起,如果標題是誤導/壞,不知道如何說出這個問題。檢查一個字符串是否需要調用String.replaceAll()與調用它

我有多個字符串列表,其中大多數將包含我需要用來替換字符串的參數。其中一些字符串(在列表中)將包含多個要替換的參數。

防爆

Comp Status `%compname` 
Comp SLA `%rackname` `%sgname` `%compname` 

我需要將墳墓'%之內更換任何東西----`用字符串,它依賴於位置的for循環。

我的問題是,我應該檢查字符串,看看它是否有我需要切換的參數之一,或者我應該只是調用每個字符串上的所有replaceAll()語句。

1.

for(String s: rackStr){ 
    newString = new String[1];     
    s = s.replaceAll("`%rackname`", rName); 
    s = s.replaceAll("`%compname`", compName); 
    s = s.replaceAll("`%sysname`", sysName); 
    newString[0] = s; 
    System.out.println(newString[0]); 
    vars.add(newString); 
} 

2.

for(String s: rackStr){ 
    newString = new String[1];  
    if(s.contains("`%rackname")){   
     s = s.replaceAll("`%rackname`", rName); 
    } 
    if(s.contains("`%compname")){   
    s = s.replaceAll("`%compname`", compName); 
    } 

    if(s.contains("`%sysname")){   
     s = s.replaceAll("`%sysname`", sysName); 
    } 

    newString[0] = s; 
    System.out.println(newString[0]); 
    vars.add(newString); 
} 

注意,我必須使newString陣列,並將其添加到一個列表瓦爾所以我可以寫入整個瓦爾變量到CSV文件通過OpenCSV writeAll();

所以我應該使用1或2?或者有些不同?

+0

我只是做了vars.add(new String [] {s});而不是創建一個新的變量。 –

回答

3

首先,如果您不使用正則表達式來定義要替換的值(在您的情況下,它們明顯是常數值,因此不需要抽象模式定義),則不應調用replaceAll

改爲使用replace(它將替換髮現的所有事件)。

它將內部調用Matcher#replaceAll,但具有表示要替換的字段的常量值。

在調用replace之前調用contains不會有很大的意義,因爲您會解析String兩次。

如果String不包含替換術語,則不會拋出異常:它不會替代它。

你也可以連接調用一些吸引眼球:

s = s 
    .replace("`%rackname`", rName) 
    .replace("`%compname`", compName) 
    .replace("`%sysname`", sysName); 
+1

令人驚訝的是[替換'的文檔](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replace-java.lang.CharSequence-java.lang。 CharSequence-)沒有明確地說如果沒有改變,它會返回相同的字符串對象。這就是我期望它做的事情,[它在Oracle的JDK上做了什麼](http://ideone.com/Eh2Iqi),但顯然不能保證它。奇。 (我打算建議說它是這樣做的,你看,但是...) –

+0

@ T.J.Crowder我同意文檔可能會更明確一些。不過,它看起來很明顯,因爲當目標或替換爲'null'時,除了'NPE'外不會引發異常。 – Mena

+0

我並不是說它會拋出異常,我們知道它不會這樣做。只是可能做更多的工作比所需要的(複製字符串)。現在,**我知道它不會,**你**知道它不會,但文件真的應該說* *。 –

1

不想第一種方式,因爲你不必擺在首位的天氣它包含或不檢查。我想寫在一條線上的3條線

s = s.replaceAll("`%rackname`", rName).replaceAll("`%compname`", compName).replaceAll("`%sysname`", sysName); 
1

簡單的事實是,它取決於。

檢查本身有開銷,但替換不是免費的。

如果你有很多不同的參數,那麼在某些時候,解析出確切的參數而不是盲目地應用它們會更便宜,因爲可能大多數都不適用。

如果你的字符串特別長,這也是有意義的,以免不必要地重複解析字符串。

最有效的技術是在一個流中完成它,僅解析字符串一次,並在顯示時應用替換。

但是對於一些短字符串的3個參數,簡單的暴力替換雖然不是運行時效率最高的,但在開發和維護上效率更高。運行效率的差異在應用程序中很可能不足。

+0

是的,我會測試這些全部的運行時間,但是我真的懷疑它會影響我的程序,因爲它只在將字符串寫入文件之前這樣做。如果需要幾秒鐘才能避免UI被鎖定,將這個函數引入它自己的線程會是一個好主意嗎? –

相關問題