2017-01-24 47 views
0

如何提供最佳性能(速度)來檢查,如果句子中包含任何關鍵詞1,關鍵詞,關鍵詞等速度優化的java字符串包含與正則表達式匹配

這裏是我的選擇:

  1. 使用String.contains:以上if(string.contains(item1)||string.contains(item2)||string.contains(item3))
  2. 或建立一個for環路選項#1 if-or-or-or之前變得失控。
  3. 使用正則表達式
  4. 另一種選擇是使用Java 8 Streaming API這是目前不適用於我。客戶端使用的Java 7
+3

嘗試一切;正確地對其進行基準測試,並選擇最適合您的測試。 –

+0

你可能想看看[Aho-Corasick](https://en.m.wikipedia.org/wiki/Aho-Corasick_algorithm),這會更好地搜索所有選項。 –

回答

0

我建議你使用正則表達式,因爲它是非常簡單和強大的

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

final String regex = "STRING1|STRING2|STRING3"; 
final String string = "xxxSTRING1xxxSTRING2xxx"; 

final Pattern pattern = Pattern.compile(regex); 
final Matcher matcher = pattern.matcher(string); 

while (matcher.find()) { 
    System.out.println("Full match: " + matcher.group(0)); 
    for (int i = 1; i <= matcher.groupCount(); i++) { 
     System.out.println("Group " + i + ": " + matcher.group(i)); 
    } 
} 

STDOUT:

Full match: STRING1 
Full match: STRING2 

DEMO在線IDE:here

1

首先,每個答案都應在生產條件下進行測試。當性能成爲問題時,內存和緩存大小,總線速度等等都會起作用,並使事情難以預測。另一個問題是這段代碼運行多少次--JVM最初將運行它的一個解釋版本,並且只有在代碼執行足夠多的時間後纔會用編譯(和更快)的版本替換它。

話雖如此,這裏有一些指針:

  • 如果你有大量的關鍵字,可以考慮並行任務。使用執行程序或並行流。這隻適用於大約100多個關鍵字,並且爲較少量的關鍵字製作較慢的代碼。
  • 如果關鍵字的使用頻率不夠高,請嘗試使用某種算法來搜索所有關鍵字,例如使用前綴樹(又名trie)。請注意,這些結構可能導致內存使用效率低下,因爲節點對象可能分散在內存中,從而在遍歷期間導致緩存未命中。這就是爲什麼ArrayList在實踐中比LinkedList快,即使它們在理論上具有相似的屬性。
  • 嘗試切換到字節數組(即使用String.getBytes),然後使用Arrays類的方法查找每個單詞。這具有內存局部性的優點。請注意,Unicode在這裏可能會很棘手,所以您可能首先需要normalize

但最重要的是,測試。只要確保你正在做你的微基準properly