2 回答

TA貢獻(xiàn)1818條經(jīng)驗 獲得超3個贊
因此,第一個也是最簡單的選擇是使用您的實際findTheWord()方法并創(chuàng)建一個使用它的新方法:
public Map<String, Integer> findTheWords(String stringToCheck, List<String> words) {
return words.stream().distinct()
.collect(Collectors.toMap(Function.identity(), word -> findTheWord(stringToCheck, word)));
}
public Integer findTheWord(String stringToCheck, String regexString) {
Pattern regexp = Pattern.compile("\\b" + regexString + "\\b");
Matcher matcher = regexp.matcher(stringToCheck);
int count = 0;
while (matcher.find()) {
count++;
}
return count;
}
這樣做的問題是,如果您使用大量單詞來查找大文本,因為它會為每個單詞遍歷給定的字符串。因此,另一種方法是為所有單詞創(chuàng)建一個正則表達(dá)式,并在生成的映射中遞增下一個找到的單詞:
public Map<String, Integer> findTheWords(String stringToCheck, List<String> words) {
Pattern regexp = Pattern.compile(words.stream().distinct().map(word -> "\\b" + word + "\\b").collect(Collectors.joining("|")));
// creates a pattern like this: "\ba\b|\bb\b|\bc\b|\bd\b|\be\b"
Matcher matcher = regexp.matcher(stringToCheck);
Map<String, Integer> result = new HashMap<>();
while (matcher.find()) {
String word = matcher.group();
result.put(word, result.getOrDefault(word, 0) + 1);
}
return result;
}
除此之外,您可能正在考慮對Set單詞使用 a 而不是 the List,因為值是唯一的,因此無需調(diào)用.distinct()流。

TA貢獻(xiàn)1810條經(jīng)驗 獲得超5個贊
HashMap 作為參數(shù),輸入字符串作為鍵,正則表達(dá)式作為值,遍歷所有條目,執(zhí)行你的方法并返回一個 HashMap,匹配的詞作為鍵,出現(xiàn)作為值。
public HashMap<String, Integer> findTheWordsAndOccurences(HashMap<String, String> stringsAndRegex) throws IOException {
HashMap<String, Integer> result = null;
for (Map.Entry<String, String> entry : stringsAndRegex.entrySet()){
String stringToCheck = entry.getKey();
String regexString = entry.getValue();
String matchString = "";
int count = 0;
Pattern regexp = Pattern.compile("\\b" + regexString + "\\b");
Matcher matcher = regexp.matcher(stringToCheck);
while (matcher.find()) {
count++;
matchString = matcher.group();
System.out.println(matchString);
result.put(matchString, count);
}
}
return result;
}
添加回答
舉報