I have a big set of strings and I want to create an autosuggest feature for it.
Assume the set is ["foo", "fighter"]
Typing "f" should return both values, and typing "fo" should only return "foo".
Currently I am just iterating through the set and filering out results by calling startsWith, however it's too slow.
The standard TreeSet with its subset functions will not help much here as it only implements a RB tree.
Is there an efficient solution in the Java API or do I have to build my own Set implementation?
Edit:
My implementation looks like this, using Andrey Naumenkos trie datastructures. Notice to increase the array size if you want to use extended ASCII characters. If you use a List instead of the Map you get the results in a sorted order.
public Set<String> getSubset(String s) {
result = new HashSet<String>();
getSubset(root, s);
return result;
}
private void getSubset(TrieNode node, String s) {
TrieNode n = node;
for (char ch : s.toCharArray()) {
if (n.children[ch] != null) {
n = n.children[ch];
continue;
}
return;
}
getSubsetR(n, s);
}
private void getSubsetR(TrieNode node, String s) {
for (char ch = 0; ch < node.children.length; ch++) {
TrieNode child = node.children[ch];
if (child != null)
getSubsetR(child, s + ch);
}
if (node.leaf) {
result.add(s);
}
}
What you are looking for is a prefix tree data structure: http://en.wikipedia.org/wiki/Trie
The code here will get you started: https://sites.google.com/site/indy256/algo/trie
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With