Для школьного проекта целью является нечеткое совпадение строки запроса с лирической строкой внутри объекта Song. Общая структура данных - это TreeMap уникальных слов в сочетании с наборами песен, которые содержат это слово в текстах.Удалить элемент из набора, который не соответствует критериям
У меня есть мой предварительный набор песен, содержащий строку запроса. Твист здесь заключается в том, что я должен назначить каждой результирующей песне ранг на основе количества символов в разделе соответствия, включая пробелы. Например, поиск «она вас любит» возвращает их среди матчей:
«... Она любит вас ...» The Beatles, rank = 13
«... Она просто любит вас ... «Бонни Райт, ранг = 18
» ... Она любит меня, а ты ...»Элвис Пресли, ранг = 23
Я использую для сортировки результатов:
for (int i=0; i<lyrics.length; i++) {
if (lyrics[i].equals(query[0])) { //got the start point
start=i; //adjust the start index point
//loop through lyrics from start point
for (int j=1; j<query.length; j++) {
if (lyrics[j].equals(query[query.length-1])) {
end=i; //found the last word
}
//if next lyric word doesn't match this query word
if (!lyrics[i+j].equals(query[j])) {
//advance loop through lyrics. when a match is found, i is adjusted to
//the match index
for (int k= i+j+1; k<lyrics.length; k++) {
if (lyrics[k].equals(query[j]) || lyrics[k].equals(query[0]))
i=k++;
} //end inner advance loop
} //end query string test
}//end query test loop
song.setRanks(start, end); //start and end points for the rank algorithm.
} //end start point test
Поскольку все композиции в результирующем наборе содержат слова запроса в любом конкретном порядке, они не будут включены в итоговую распечатку. Используя этот алгоритм, как я могу установить триггер для удаления песни из набора, если запрос не соответствует какой-либо определенной длине?
Редактировать - Является ли Lucene решением для этого? Это серая область в проекте, и я буду подниматься в классе завтра. Он позволяет нам выбирать любые структуры данных для этого проекта, но я не знаю, пройдет ли использование другой реализации для сопоставления строк.
Редактировать 2 @ belisarius- Я не вижу, как здесь применяется дистанция редактирования. Наиболее распространенное применение расстояния Левенштейна требует строкой a длины n и строкой b длины m, а расстояние - количеством исправлений, необходимых для a == b. Для этого проекта все, что требуется, - это ранг символов в матче с неизвестными начальным и конечным точками. С некоторыми изменениями в вышеприведенном коде, я нахожу точку начала и конца точно. Мне нужен способ удалить несоответствия из набора, если текст не подходит для поиска любым способом.
Взгляните на «Изменить расстояние» (google для него) – 2010-11-30 00:42:18