В последнем проекте семестра цель состоит в том, чтобы выполнить поиск определенной фразы в текстовой строке внутри объекта Song, а затем ранжировать результаты на основе длины совпадения подстроки.Текст песни был прочитан из файла и соответствует разрывам строк в этом файле.
Например, поиск «Она тебя любит» вернул бы их в примерах соответствия:
The Beatles: "... Она любит тебя , да, да, да ... "Ранг = 13 символовБонни Райт: "... Она просто любит тебя ..." Ранг = 18 символовЭлвис Пресли: «... Вы спрашиваете, любит ли 1012 * меня \ r \ nНу, вы не знаете ..." Ранг = 23 символа
Как видно из последнего примера, совпадения могут занимать несколько строк.
У меня есть все песни в TreeMap<String, TreeSet<Song>>
, поэтому я получаю все песни, которые соответствуют первому слову взапрос.Трудность, с которой я сталкиваюсь, заключается в поиске совпадений в строке, поскольку в этой ситуации регулярное выражение не будет работать.
Когда объект Song создан, я поместил текст в набор для запуска поиска одногослово, и для этого я использовал String.split("[^a-zA-Z}")
, чтобы выделить отдельные слова и отсеять знаки препинания.Поэтому я хочу запустить поиск по этому массиву.Процесс, который я использую, выглядит следующим образом:
break up the query into a String array
for each Song in the set
if (song.lyrics.contains(query)
great, break loop to next song
otherwise
int queryCounter=0;
find first index point in String array that matches query[queryCounter]
using that as the start point, iterate through the String array for matches
Когда итерация завершена, создается объект Rank, в котором содержатся песня, поисковая фраза, начальная точка и конечные точки соответствующего раздела массива.В объекте Rank есть метод подсчета количества символов и компенсации пробелов для вычисления ранга.Затем он вставляется в PriorityQueue, где первые десять совпадений будут извлечены из исходного набора совпадений.
Проблема в том, что это не предотвращает ложные срабатывания, и ранги совпадений могут быть искажены.Например, Aerosmith Beyond Beautiful содержит «... она любит меня, она не любит тебя ...» В моем процессе я подхожу »... она любит меня, она любит тебя не ... ", поэтому вместо 13-го уровня я получу 27-е место.
Какие изменения необходимы мне, чтобы отсеять ложные срабатывания и неправильные оценки?