Поиск подстрок в Java - PullRequest
       23

Поиск подстрок в Java

0 голосов
/ 27 марта 2012

Я пытаюсь сделать следующее: у меня есть список имен (примерно 40000), который останется неизменным, и текстовый файл (примерно 10000 строк), который будет меняться от поиска к поиску.Мне нужно найти подходящий способ поиска по каждой строке в текстовом файле, чтобы увидеть, есть ли точное совпадение строк между именем и текстом, а затем вернуть совпадения и вхождения (см. Ниже).Я реализовал это с помощью вложенного цикла for, который, как наиболее вероятно, известно, очень медленный.Я уверен, что другие искали этот же вопрос, и я прошу прощения, если этот вопрос повторяется, однако, я значительно искал подходящий ответ и до сих пор безуспешно.Я был бы признателен за любую помощь, которая может быть предложена (предпочтение Java).Также обратите внимание, что любая структура, которая ускорит этот поиск, будет полезна для меня (не обязательно должна быть лучшей).Искреннее спасибо за любую помощь.

Пример:

names.txt (статический) Энди Дик Эндрю Каннингем.,,Исаак П. Ньютон.,,Zulu

text.txt (динамический) Это случайный текст, который может содержать или не содержать имена, такие как Исаак П. Ньютон или Зулу.Больше строк здесь ... Еще один зулус ...

Мне нужно вернуть следующее: Исаак П. Ньютон 1 Зулус 2

Ответы [ 2 ]

0 голосов
/ 11 июня 2012

Я бы предложил построить конечный автомат из 40000 имен. В Java вы можете сделать это, используя регулярные выражения. Создайте регулярное выражение, объединив каждое имя с "|" условное обозначение. Скомпилируйте шаблон и сопоставьте каждую строку ввода с ним.

0 голосов
/ 11 июня 2012

Вы можете использовать HashMap из Java, где вы загружаете все имена в names.txt в HashMap и затем выполняете поиск в нем. Это должно улучшить вашу производительность. Вот пример кода.

       HashMap<String, Integer> textNames = new HashMap<String, Integer>();
       for (String name : nameFile) {
           textNames.put(name, 0);
       }

       for (String line : textFile) {
           if (textNames.containsKey(line)) {
               textNames.put(line, textNames.get(line)+1);
           }
       }

- V

...