Я бы просто использовал NavigableMap или аналогичный Set, если вам не нужно значение.
Скажем, вам нужно искать слова, начинающиеся с "abc", которые вам просто нужно сделать
NavigableMap<String, Boolean> wordmap = new TreeMap<String, Boolean>();
Random random = new Random(1);
for(int i=0;i<10*1000*1000;i++)
wordmap.put(Long.toString(Math.abs(random.nextLong()), 36).substring(1), true);
String prefix = "abcd";
for (String word : wordmap.subMap(prefix, prefix+"\uffff").keySet()) {
System.out.println(word + " starts with " + prefix);
}
// или
for (String word : wordmap.tailMap(prefix).keySet()) {
if (!word.startsWith(prefix)) break;
System.out.println(word + " starts with " + prefix);
}
На моем аппарате используется 1 ГБ для 10 миллионов записей и отпечатков
abcd0krpbk1 starts with abcd
abcd7xi05pe starts with abcd
abcdlw4pwfl starts with abcd
РЕДАКТИРОВАТЬ: на основе обратной связи я бы предложил что-то вроде следующего подхода.
// keys stored in reverse order of the original string.
NavigableMap<String, Boolean> wordmap
String search = "dcba";
// retains hte order keys were added.
Map<String, Boolean> results = new LinkedHashMap<String, Boolean>();
for(int i=search.size();i>=1;i--) {
String s = search.substring(0, i);
results.putAll(wordmap.subMap(s, s+'\uFFFF')); // ignores duplicates
}
Результаты будут объединять все поисковые запросы в порядке их добавления, от наиболее конкретного к наименее конкретному.
}