你需要停止迭代爲一旦你得到一個匹配,所以假設你使用Java 8
,你的for
循環可以被有效地重寫爲下一個:
boolean match = words.stream().anyMatch(w -> p.matcher(w).matches());
您還可以使用parallelStream()
而不是stream()
來並行化研究,特別是如果您的Set
有很多單詞。
如果您不使用Java 7
,仍然可以使用FluentIterable
從Google Guava完成,但不幸的是不能並行化研究。
boolean match = FluentIterable.from(words).anyMatch(
new Predicate<String>() {
@Override
public boolean apply(@Nullable final String w) {
return p.matcher(w).matches();
}
}
);
但在你的情況,我不認爲使用FluentIterable
可以比簡單地增加一個break
更有趣,當你得到一個比賽,因爲它仍然會更容易閱讀和維護
if (p.matcher(setWord).matches()) {
match = true;
break;
}
所以,如果你真的需要使用正則表達式並且你不能使用Java 8
,你最好的選擇是使用break
,如上所述,沒有什麼魔術可以考慮。
假設你將只有一個字符替換,它可以用做startsWith(String)
和endsWith(String)
這將永遠是比一個正則表達式快得多。類似這樣的:
// Your words should be in a TreeSet to be already sorted alphabetically
// in order to get a match as fast as possible
Set<String> words = new TreeSet<String>(); //this set is already populated
int index = word.indexOf('.');
if (index != -1) {
String prefix = word.substring(0, index);
String suffix = word.substring(index + 1);
boolean match = false;
for (String setWord : words){
// From the fastest to the slowest thing to check
// to get the best possible performances
if (setWord.length() == word.length()
&& setWord.startsWith(prefix)
&& setWord.endsWith(suffix)) {
match = true;
break;
}
}
if(match)
System.out.println("Its a match");
else
System.out.println("Its not a match");
}
else {
System.out.println("The word does not contain regex do other stuff");
}
是否有該組多個匹配的任何機會呢? – Rehman
多重比賽是什麼意思?如果我使用正則表達式搜索單詞「w.od」,它會給出多個匹配的單詞「word&wood」。 –