2010-11-11 61 views
0

對於本學期的最後一個項目,目標是在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的排名。

我需要什麼變化來消除誤報和不正確的排名?

+1

基本上,在'其他'塊中,在找到匹配開頭的第一個索引之後,還必須查找可能的其他起始點,並在找到另一個起始點時重置開始點。 – jjnguy 2010-11-11 15:06:31

+0

我建議我們http://homework.stackoverflow.com/,我們只是轉發所有的家庭作業有。 :) – 2010-11-11 15:08:31

+0

我不會介意,問題是每一個崗位在過去的一個月,我標記-homework-已被編輯刪除標籤。 – Jason 2010-11-11 15:16:39

回答

1

我想補充一下jjinguy說:

基本上,「否則」塊,以後你會發現開始匹配的第一個指標,你還必須尋找其他可能的起點,並重置你的開始,如果你找到另一個

我會保留一首歌曲中所有可能的匹配的列表,並最終使用最好的排名。簡單地重新設置起點可能無法獲得最佳排名的比賽。

也許這不是最好的方式,但關注仍然存在。

相關問題