Если вы хотите сделать это полностью в памяти и без каких-либо зависимостей, вот один быстрый вариант:
static int MAX_PREFIX = 3;
Map<String, List<String>> map = new HashMap<String, List<String>>();
public void addItem(String item) {
for (int i = 0; i < MAX_PREFIX && i < item.length(); i++) {
String prefix = item.substring(0, i);
List<String> matches = map.get(prefix);
if (matches == null) {
matches = new ArrayList<String>();
map.put(prefix, matches);
}
matches.add(item);
}
}
public List<String> getMatches(String prefix) {
List<String> matches = map.get(prefix);
return matches == null ? Collections.<String>emptyList() : matches;
}
Это будет очень быстро, так как это всего лишь один Map
поиск, чтобы перейти от вашего префикса String
прямо к List<String>
ваших желаемых результатов. Если ваш список настолько велик, что не умещается в памяти, вам нужно подумать о выходе из него. Как уже упоминалось, вы можете посмотреть на Lucene для локального индекса. Или базу данных, просто проиндексируйте столбец и выполните запрос LIKE 'prefix%'
.