2012-03-27 5 views
0

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

Пример:

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

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

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

+3

Что вы пробовали? Это домашнее задание? Используйте карту для сохранения статических имен и количества ошибок. – pcalcao

+0

Несвязанный, но моя фамилия Ньютон, и я пошел в старшую школу с Энди. Так и есть. –

+4

Вы можете использовать lucene в своем приложении, но для этого вам сначала нужно индексировать документы (текстовые файлы). Тогда поиск будет производиться с молниеносной скоростью. –

ответ

0

Вы можете использовать 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

0

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

Смежные вопросы