2010-11-29 1 views
7

Для школьного проекта целью является нечеткое совпадение строки запроса с лирической строкой внутри объекта 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. Для этого проекта все, что требуется, - это ранг символов в матче с неизвестными начальным и конечным точками. С некоторыми изменениями в вышеприведенном коде, я нахожу точку начала и конца точно. Мне нужен способ удалить несоответствия из набора, если текст не подходит для поиска любым способом.

+1

Взгляните на «Изменить расстояние» (google для него) – 2010-11-30 00:42:18

ответ