2010-11-29 16 views
7

एक स्कूल प्रोजेक्ट के लिए, लक्ष्य एक क्वेरी स्ट्रिंग के एक गीत स्ट्रिंग के लिए एक गीत स्ट्रिंग के एक फ़ज़ी मैच को करना है। समग्र डेटा संरचना गानों के सेट के साथ जोड़े गए अद्वितीय शब्दों का वृक्षारोपण है जिसमें गीत में वह शब्द होता है।एक सेट से किसी आइटम को निकालें जो मानदंड से मेल नहीं खाता

मेरे पास गानों का प्रारंभिक मिलान सेट है जिसमें क्वेरी स्ट्रिंग है। यहां मोड़ यह है कि मुझे प्रत्येक परिणाम गीत को मैच अनुभाग में वर्णों की संख्या, रिक्त स्थान सहित अक्षरों की संख्या के आधार पर एक रैंक असाइन करना होगा। उदाहरण के लिए, "वह आपको प्यार करती है" की तलाश में इन मैचों में से एक है:

"... वह आपको प्यार करती है ..." बीटल्स, रैंक = 13
"... वह सिर्फ आपको प्यार करती है ... "बोनी Raitt, रैंक = 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 

चूंकि परिणाम सेट में मौजूद सभी गीतों में किसी भी विशेष क्रम में क्वेरी शब्द होते हैं, इसलिए उन्हें परिणाम प्रिंटआउट में शामिल नहीं किया जाएगा। इस एल्गोरिदम का उपयोग करके, यदि सेट किसी भी विशेष लंबाई से मेल नहीं खाता है तो सेट से गीत को निकालने के लिए मैं ट्रिगर कैसे सेट कर सकता हूं?

संपादित करें- क्या लुसीन इसका समाधान है? यह परियोजना में एक भूरा क्षेत्र है, और एक मैं कल कक्षा में लाऊंगा। वह हमें इस परियोजना के लिए जो भी डेटा संरचना चुनने की इजाजत दे रहा है, लेकिन मुझे नहीं पता कि स्ट्रिंग मिलान के लिए एक और कार्यान्वयन का उपयोग करना आवश्यक है या नहीं।

2 @ बेलिसियस संपादित करें- मुझे नहीं पता कि संपादन दूरी यहां कैसे लागू होती है। लेवेनशेटिन दूरी का सबसे आम अनुप्रयोग लंबाई की लंबाई और स्ट्रिंग बी की स्ट्रिंग ए की आवश्यकता होती है, और दूरी == बी के लिए आवश्यक संपादन की संख्या होती है। इस प्रोजेक्ट के लिए, जो कुछ आवश्यक है वह एक मैच में वर्णों का रैंक है, जिसमें प्रारंभ और अंत बिंदु अज्ञात हैं। ऊपर पोस्ट किए गए कोड में कुछ बदलावों के साथ, मुझे शुरुआत और अंत बिंदु सटीक रूप से मिल रहा है। यदि मुझे किसी भी फैशन में खोज फिट नहीं होती है तो मुझे सेट से गैर-मैचों को हटाने का एक तरीका है।

+1

पर "दूरी संपादित करें" एक नजर डालें (इसके लिए गूगल) –

+0

पहले से ही था, लेकिन नहीं देख सकते हैं कि यह कैसे मेरी दुविधा – Jason

+1

साथ फिट बैठता है मैं एक समाधान के काम कर रहे हैं: एक Set.remove (गीत) एक 'ConcurrentModificationException फेंकता चूंकि मैं लूप के लिए बढ़ाए गए सेट का उपयोग करके सेट के माध्यम से पुनरावृत्ति कर रहा हूं, इसलिए मैंने अंतिम क्वेरी शब्द के मिलान के बिना गीत स्ट्रिंग के अंत तक पहुंचने पर झूठी स्विच करने के लिए एक बुलियन ट्रिगर का उपयोग किया। उस मूल्य के आधार पर, परिणाम परिणाम कतार में जोड़ा जाएगा। – Jason

उत्तर

0

पेट्रीसिया ट्राई सिर्फ आपके लिए ही कर सकता है।

इस माध्यम से जाएं कि क्या आपको इसकी आवश्यकता है या नहीं।

http://code.google.com/p/patricia-trie/

1

शायद आप Levenstein distance पर एक नजर है करना चाहते हैं। अपाचे कॉमन्स-लैंग लाइब्रेरी ने इसे StringUtils कक्षा में संस्करण 2.1 में कार्यान्वित किया।

संबंधित मुद्दे

 संबंधित मुद्दे