Как @Jiri говорит, что вы можете использовать DAWG, но если вы не хотите заходить так далеко, вы можете сделать несколько простых и полезных вещей.
Использовать сортировку
- Если вы хотите отсортировать массив слов, сделайте это ранее. не сортируйте это каждый раз
- После сортировки вы можете найти первое и последнее слово в списке, которые совпадают. Используйте list.subList (from, to) для возврата подсписка. Немного более оптимальным является добавление каждого из них.
Использовать предварительно отсортированную структуру
- Используйте
TreeSet<String>
для хранения строк (они будут отсортированы внутри).
- Затем используйте
treeSet.subSet(from, true, to, false)
;
Где from
- префикс, а to
- «префикс плюс один символ». Например, если вы ищете abc
, to
должно быть abd
. Если вы все равно не хотите выполнять преобразование символов, вы можете запросить treeSet.headSet(from)
и повторять его, пока не прекратятся префиксы.
Это особенно полезно, если вы читаете больше, чем пишете. Возможно, заказ струн стоит немного дороже, но после заказа вы можете найти их очень быстро (O(log n)
).
Сравнение без учета регистра
Вы можете предоставить Comparator<String>
для набора деревьев, чтобы указать, как он должен упорядочить строки. Вы можете реализовать его, или, может быть, есть встроенный компаратор без учета регистра.
В любом случае его код должен быть:
int compare(String a, String b) {
return a.toLowerCase().compareTo(b.toLowerCase());
}