2015-12-04 61 views
2

我有一個字符串列表(超過5000個計數)下面列出的示例,這些字符串由相等的「=」分隔符分隔,分隔符的左側是我需要檢查另一個字符串的結束的字符串,如果有匹配,那麼我需要用字符串的右側替換它。從Java中的另一個字符串列表中替換字符串的最後一個子字符串的最有效方法

,.LLC=LLC 
D.E.F.=DEF 
&,Aida.=AID 
&ECho,MA=ECHO 

例子:

  1. 如果字符串HelloD.E.F.比它應該由HELLO DEF
  2. 被替換如果字符串Hello&ECho,MA比它應該由HELLO ECHO

被替換需要找到最有效的方式來完成它。而不是遞歸地迭代所有的字符串。 (高效的消耗時間,內存消耗不成問題。)

+0

我已經嘗試將這個存儲在Arraylist中,然後將它與字符串進行比較以完成它。 – Arpan

+0

顯示你在你的問題中試過的代碼 – depperm

+1

如果你想準確地匹配許多模式,Aho-Corasick算法可能是解決方案。或拉賓卡普。兩者都被設計用於同時匹配多個預處理模式。 – biziclop

回答

1

有很多合理的方法可以做到這一點,具體取決於您的具體要求。就我個人而言,我不會用Java來做這件事;我想將您=分隔成的圖案更換sed,例如: -

s/,.LLC/LLC/ 
s/D.E.F./DEF/ 
s/&,Aida./AID/ 
s/&ECho,MA/ECHO/ 

您可能必須根據確切的字符串做一些額外的轉義;例如\(是特別的。一旦你有你sed風格的表達簡單地傳遞在你輸入的字符串,你會得到你想要的字符串:

$ sed -f list_of_patterns.txt list_of_strings.txt 

如果你真的需要做到這一點在Java中,你可能會想解析替換爲Map<String, String>,然後遍歷字符串,逐個檢查地圖中匹配的後綴。從最後一個字符開始,然後是最後兩個,最後三個,依此類推。如果找到匹配項,則可以將字符串的其餘部分(匹配的後綴之前)與地圖中的相應值連接起來。

這是關於替換次數的O(1),而O(n)表示需要替換的字符串中的字符數。

+0

這又只能用於O(n)。 \t \t HashMap al = new HashMap (); \t \t al.put(「,LLC」,「LLC」); \t \t al.put(「D.E.F。」,「DEF」); \t \t al.put(「&,Aida。」,「AID」​​); \t \t al.put(「&ECho,MA」,「ECHO」); \t \t \t \t String inputString =「HelloD.E.F。「 \t \t \t \t如果(al.keySet()包含(inputString)){\t \t \t \t \t的System.out.println(」 工作「); \t \t} \t \t其他 \t \t \t的System.out.println( 「不工作」); – Arpan

+0

下面是工作: - \t \t迭代迭代= al.keySet()迭代();。\t \t while(iterator.hasNext()){ \t \t Object key = iterator.next(); \t \t Object value = al.get(key); \t \t \t 如果\t(inputString.contains(key.toString())) \t \t { \t \t \t的System.out.println( 「工作」); \t \t \t \t \t} \t \t} – Arpan

+0

我不知道你在問什麼;如果你有代碼片段編輯它們到你的問題,評論是不可能讀取。 – dimo414

相關問題