對於本學期的最後一個項目,目標是在Song對象內部的歌詞字符串上運行特定短語的搜索,然後根據長度對結果進行排名的子串匹配。歌詞是從文件中讀取的,並匹配該文件中的換行符。查找包含另一個字符串的字符串部分,其中可能存在干涉詞
例如,搜索「她愛你」將在樣本匹配返回這些:
披頭士:「...... 她愛你,是啊,是啊,是啊......」等級= 13個字符
健美的Raitt: 「...... 她只是愛你 ...」 排名= 18個字符
貓王:」 ......你問如果她愛我 \ r \ N井,you不知道...「等級= 23個字符
正如您在上一個示例中所看到的,匹配可以跨越多行。
我擁有TreeMap<String, TreeSet<Song>>
中的所有歌曲,所以我得到了與查詢中第一個單詞相匹配的所有歌曲。我遇到的困難是在字符串中搜索匹配,因爲在這種情況下正則表達式不起作用。
當歌曲對象被構建時,我將歌詞放入一個Set來運行搜索單個單詞,並使用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對象是一種計算字符數並補償空白來計算等級的方法。然後將其插入PriorityQueue中,前十個匹配將從原始匹配集中提取。
問題是,這並不能防止誤報,並且匹配等級可能會偏斜。例如,史密斯飛船的超越美麗含有「......她愛我,她愛你不是......」隨着我的過程中,我將匹配「...... 她愛我她愛你不 ...」,所以而不是13的排名,我會得到27的排名。
我需要什麼變化來消除誤報和不正確的排名?
基本上,在'其他'塊中,在找到匹配開頭的第一個索引之後,還必須查找可能的其他起始點,並在找到另一個起始點時重置開始點。 – jjnguy 2010-11-11 15:06:31
我建議我們http://homework.stackoverflow.com/,我們只是轉發所有的家庭作業有。 :) – 2010-11-11 15:08:31
我不會介意,問題是每一個崗位在過去的一個月,我標記-homework-已被編輯刪除標籤。 – Jason 2010-11-11 15:16:39