@pqgg7nwkd4

Как сделать idea-подобный поиск?

В идее можно искать (Shift, Shift) идентификаторы таким образом по началам слов:
Допустим чтобы найти ArrayList можно набрать al, ali, arrli, li, ...
Или что бы найти LinkedHashMap: lh, lhmap, hm, ...

Допустим, разбить идентификаторы на слова я могу, как мне составить индекс и как быстро искать по нему?

UPD: немного уточню/переформулирую вопрос:
Есть список предложений от 100000 штук. В каждом предложении по 1–4 слова.
Допустим одно из предложений "зелёный лес".
Пользователь набирает слово-запрос для поиска и из всего списка предложений нужно найти подходящие. Предложение подходит по запросу, если запрос состоит из конкатенации начал слов в предложении (можно с пропусками слов).
Допустим зелёному лесу соответствуют запросы:
з (зелёный лес)
зл (зелёный лес)
злес (зелёный лес)
зелле (зелёный лес)
зе (зелёный лес)
ле (зелёный лес)
А эти не соответствуют:
зес
ел
ес
Вопрос, как такой фильтр сделать?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
maaGames
@maaGames
Погроммирую программы
ArrayList
разделяешь на отдельные слова по заглавной букве, подчёркиванию и любым другим символам, допускаемым языком, в том числе и цифрам. получается два слова "array" и "list". регистр ужн оубрать, либо не учитывать его при поиске (либо учитывать, если хочется).
Далее для всех слов создаёшь комбинации, как было описано в комментарии выше, но не вручную, а автоматически
a + l = al
ar + l = arl
arr + l = arrl
...
array + l = arrayl
...
Если слов в идентификаторе больше двух, то проделываешь это для всех слов. Для каждой аббревиатуры записываешь, из какого идентификатора она была получена, одной аббревиатуре может соответствовать много различных идентификаторов).

Это может показаться страшным и занимающим кучу памяти, но идентификаторов в программах конечное число и оно довольно маленькое по машинным меркам.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
longclaps
@longclaps
import re

names = ['ArrayList', 'LinkedHashMap']

for s in 'al', 'ali', 'arrli', 'li', 'lh', 'lhmap', 'hm':
    f = re.compile('\\w*'.join(s), flags=re.I).search
    print(f'{s:5}:', list(filter(f, names)))
выхлоп:
al   : ['ArrayList']
ali  : ['ArrayList']
arrli: ['ArrayList']
li   : ['ArrayList', 'LinkedHashMap']
lh   : ['LinkedHashMap']
lhmap: ['LinkedHashMap']
hm   : ['LinkedHashMap']
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы