Я сам не использовал Apache Commons PatriciaTrie, но, насколько я заметил, вы можете легко получить только карту слов с префиксом какой-либо строки.Большинство примеров, которые я нашел, также предоставляют базовые операции, такие как вставка, поиск.Я также сталкивался с некоторыми обсуждениями реализации Trie в guava, но ничего особенного.
Итак, вот мое простое предложение о пользовательской реализации (но при использовании пользовательской реализации его следует покрыть хорошим набором тестов).).
public class SimpleTrie {
private static final int ALPHABET_COUNT = 26;
class TrieNode {
char value;
TrieNode[] children;
boolean isValidWord;
TrieNode() {
this(' ');
}
TrieNode(char value) {
this.value = value;
children = new TrieNode[ALPHABET_COUNT];
isValidWord = false;
}
}
private TrieNode root = new TrieNode();
public void insert(String word) {
TrieNode current = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (current.children[c - 'a'] == null) {
current.children[c - 'a'] = new TrieNode(c);
}
current = current.children[c - 'a'];
}
current.isValidWord = true;
}
public List<String> findValidPrefixes(String word) {
List<String> prefixes = new ArrayList<>();
TrieNode current = root;
StringBuilder traversedPrefix = new StringBuilder();
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (current.children[c - 'a'] != null) {
current = current.children[c - 'a'];
traversedPrefix.append(c);
if (current.isValidWord) {
prefixes.add(traversedPrefix.toString());
}
}
}
return prefixes;
}
public static void main(String[] args) {
SimpleTrie trie = new SimpleTrie();
// insert "ab", "abc", "abcd", "bc" and "bcd"
trie.insert("ab");
trie.insert("abc");
trie.insert("abcd");
trie.insert("bc");
trie.insert("bcd");
List<String> validPrefixes = trie.findValidPrefixes("abcdefg");
System.out.println(validPrefixes);
}
}