matching for all keywords

This commit is contained in:
mherbaghinyan 2019-01-14 11:53:53 +04:00
parent 04c6cd1215
commit c9275edf90

View File

@ -1,6 +1,7 @@
package com.baeldung.string; package com.baeldung.string;
import org.ahocorasick.trie.Emit; import org.ahocorasick.trie.Emit;
import org.ahocorasick.trie.Token;
import org.ahocorasick.trie.Trie; import org.ahocorasick.trie.Trie;
import java.util.*; import java.util.*;
@ -17,7 +18,7 @@ public class MatchWords {
containsWords(inputString, words); containsWords(inputString, words);
containsWordsJava8(new ArrayList<>(Arrays.asList(inputString.split(" "))), new ArrayList<>(Arrays.asList(words))); containsWordsJava8(inputString, words);
containsWordsPatternMatch(inputString, words); containsWordsPatternMatch(inputString, words);
@ -52,36 +53,56 @@ public class MatchWords {
private static boolean containsWordsAhoCorasick(String inputString, String[] words) { private static boolean containsWordsAhoCorasick(String inputString, String[] words) {
Trie trie = Trie.builder() Trie trie = Trie.builder()
.onlyWholeWords() .onlyWholeWords()
.addKeyword(words[0]) .addKeywords(words)
.addKeyword(words[1])
.ignoreOverlaps()
.build(); .build();
Collection<Emit> emits = trie.parseText(inputString) Collection<Emit> emits = trie.parseText(inputString);
.stream()
.filter(e -> !Objects.equals(e.getKeyword(), e.getKeyword()))
.collect(Collectors.toList());
emits.forEach(System.out::println); emits.forEach(System.out::println);
return emits.size() == words.length; boolean found = true;
for(String word : words) {
boolean contains = Arrays.toString(emits.toArray()).contains(word);
if (!contains) {
found = false;
break;
}
}
return found;
} }
private static boolean containsWordsPatternMatch(String inputString, String[] words) { private static boolean containsWordsPatternMatch(String inputString, String[] words) {
Pattern pattern = Pattern.compile("(?=.*" + words[0] + ")(?=.*" + words[1] + ")"); StringBuilder regexp = new StringBuilder();
for (String word : words) {
regexp.append("(?=.*").append(word).append(")");
}
Pattern pattern = Pattern.compile(regexp.toString());
if (pattern.matcher(inputString).find()) { if (pattern.matcher(inputString).find()) {
return true; return true;
} }
return false; return false;
} }
private static boolean containsWordsJava8(ArrayList<String> inputString, ArrayList<String> words) { private static boolean containsWordsJava8(String inputString, String[] words) {
return words.stream().allMatch(inputString::contains); ArrayList inputStringList = new ArrayList<>(Arrays.asList(inputString.split(" ")));
ArrayList<String> wordsList = new ArrayList<>(Arrays.asList(words));
return wordsList.stream().allMatch(inputStringList::contains);
} }
private static boolean containsWordsArray(ArrayList<String> inputString, ArrayList<String> words) { private static boolean containsWordsArray(String inputString, String[] words) {
return inputString.containsAll(words); ArrayList inputStringList = new ArrayList<>(Arrays.asList(inputString.split(" ")));
ArrayList<String> wordsList = new ArrayList<>(Arrays.asList(words));
return inputStringList.containsAll(wordsList);
}
private static boolean containsAnyWord(String inputString, String[] words) {
ArrayList inputStringList = new ArrayList<>(Arrays.asList(inputString.split(" ")));
ArrayList<String> wordsList = new ArrayList<>(Arrays.asList(words));
return inputStringList.contains(wordsList);
} }
} }