Очевидный подход грубой силы состоит в том, чтобы перебирать ключи на карте и сопоставлять их с последовательностью символов. Это может быть хорошо для маленькой карты, но, конечно, она не масштабируется.
Это можно улучшить, используя вторую карту для кэширования результатов поиска. Всякий раз, когда вы собираете список ключей, соответствующих заданной последовательности символов, вы можете сохранить их на второй карте, чтобы в следующий раз поиск был быстрым. Конечно, если оригинальная карта часто меняется, обновление кеша может оказаться сложным. Как всегда с кешами, это работает лучше всего, если карту читают гораздо чаще, чем изменяют.
В качестве альтернативы, если вы заранее знаете возможные последовательности символов, вы можете предварительно сгенерировать списки совпадающих строк и предварительно заполнить карту кеша.
Обновление: Hashtable
в любом случае не рекомендуется - оно синхронизируется, поэтому намного медленнее, чем должно быть. Вам лучше использовать HashMap
, если нет параллелизма, или ConcurrentHashMap
в противном случае. Последние значительно превосходят Hashtable
.
Кроме того, я не могу придумать лучшую коллекцию для этой задачи, чем карты. Конечно, вы можете поэкспериментировать с различными реализациями карт, чтобы найти ту, которая лучше всего соответствует вашим конкретным обстоятельствам и моделям использования. В общем, это будет
Map<String, Object> fruits;
Map<String, List<String>> matchingKeys;