2012-05-23 10 views
5

मेरे पास आइटमों की सूची है (i.e स्ट्रिंग्स) जिन्हें मुझे सॉर्ट/फ़िल्टर करने की आवश्यकता है।जावा में सेट से आइटम को फ़िल्टर करें

अंतिम परिणाम में कोई डुप्लिकेट (आसान) नहीं है, मैं उन्हें सेट में रखूंगा। तो मेरे पास अब तारों का एक सेट है।

अधिक स्पष्टीकरण ..

मैं भी एक विधि एक्स कि दो स्ट्रिंग्स (levenstein दूरी का उपयोग करके) के बीच अंतर की राशि की गणना की है।

प्रश्न:

मेरी सेट set में नए स्ट्रिंग string डालने मैं तुलना में मैं चाहिए string और set में किसी भी अन्य स्ट्रिंग के बीच और अगर x रिटर्न >=3levenstein दूरी के लिए जाँच करने के लिए विधि x का उपयोग कर चाहते हैं इससे पहले कि इसे जोड़ें नहीं

ऐसा करने का मेरा सबसे अच्छा शॉट क्या है? डालने के लिए प्रत्येक string के लिए पुनरावृत्ति set को छोड़कर?

+1

अपनी खुद की स्थानीय ऐड विधि बनाएं जो इसके लिए जांच करे और फिर परीक्षण को पारित करने पर इसे सेट में जोड़ दें। – jn1kk

+0

यह असंभव है कि एक ऐसा समाधान है जो पूरे सेट के माध्यम से संभावित रूप से पुन: प्रयास किए बिना करता है, क्योंकि आप अनिवार्य रूप से उस स्ट्रिंग को ढूंढना चाहते हैं जो आपके द्वारा डालने वाले किसी से दूर से दूर है और उस दूरी का परीक्षण करें। आरामदायक बात यह है कि एक बार जब आप बड़ी दूरी पाते हैं तो आप पुनरावृत्ति को शॉर्ट-सर्किट कर सकते हैं। इंगित करने के लिए एक अंतिम बात यह है कि परिणाम सम्मिलन आदेश पर निर्भर है: '345 34567 12345'' 12345' को अस्वीकार कर देगा, लेकिन '345 12345 34567'' 34567' को अस्वीकार कर देगा (यह सिर्फ अजीब है कि आप इसे चाहते हैं)। – trutheality

उत्तर

2

Set के माध्यम से इटरेटिंग आपकी सबसे अच्छी शर्त होगी, क्योंकि कोई भी अंतर्निहित Set कार्यान्वयन नहीं है जो आपको संभावनाओं को कम करने में मदद करेगा।

1

सेट बनाते समय आप एक कस्टम तुलनित्र का उपयोग कर सकते हैं। आपके तुलनित्र में आप लौटते हैं कि दो स्ट्रिंग समान हैं यदि वे समान हैं (नियमित स्ट्रिंग तुलना नियमों के अनुसार) या यदि उनकी लेवेनस्टीन दूरी आपके मानदंडों को पूरा करती है।

जब आपका कॉमप्रेटर कहता है कि दो तार समान हैं, तो नई स्ट्रिंग सेट में डाली नहीं जाती है। (नोट इसका मतलब है कि स्ट्रिंग के अंतिम परिणाम प्रविष्टि के आदेश पर निर्भर कर सकते हैं)

अद्यतन: कुल आदेश के बारे में संबोधित करते टिप्पणियां:

एक तरह एक तुलनित्र ऊपर सुझाव का उपयोग करना endresult निर्भर होगा सम्मिलन के आदेश पर (जैसा ऊपर बताया गया है), जैसा कि लेवेनस्टीन दूरी मानदंडों के रूप में उपयोग किया गया कोई अन्य समाधान कुल ऑर्डरिंग को परिभाषित नहीं करता है।

ओटीओएच, एक बार एक स्ट्रिंग गैर-बराबर परीक्षण पास करती है और सेट में डाली जाती है, तो सेट में कोई अन्य स्ट्रिंग इस के बराबर की तुलना नहीं करेगी, इसलिए सेट में स्ट्रिंग्स उनके प्राकृतिक स्ट्रिंग ऑर्डरिंग का उपयोग करेंगी, जो करता है कुल ऑर्डरिंग को परिभाषित करें, इसलिए सेट के आंतरिक संचालन (जैसे सॉर्टिंग) के भीतर कोई और असंगतता उत्पन्न नहीं होती है।

+1

आप इसे कुल क्रम में कैसे बनायेंगे? मैं इसे देख नहीं रहा हूँ। –

+0

आपके लेवेनस्टीन दूरी मानदंडों का उपयोग करके आपको कुल ऑर्डरिंग नहीं मिलेगी (उदा। सेट 2000> get000 == tit011 == set000) – Attila

+0

उम ... तुलनित्र के लिए दूरी का उपयोग करके आपको एक असंगत आदेश मिल जाएगा। इसलिए आप एक तुलनित्र का सुझाव क्यों दे रहे हैं इस बारे में भ्रम का उपयोग किया जाना चाहिए। – trutheality

2

मैंने अपने विचार के साथ खेला है कि इसे कैसे किया जाए। मैं बिना किसी पुनरावृत्ति के इसे करने के तरीके के बारे में सोच नहीं सकता।

मान लीजिए कि आपके पास distance(String,String):int नामक विधि है जो दो स्ट्रिंग्स के बीच दी गई दूरी देता है।

String x = "Obi-wan"; //this is the item subject to eval addition 
List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin")); 
if (items.filter(s -> distance(s, x) >= 3).getFirst() == null) { 
    items.add(x); 
} 

आप JDK8 Preview का उपयोग करते हैं आप ऊपर वास्तव में कोड का उपयोग कर कुछ ही समय में यह कर सकते हैं। Iterables.getFirst() विधि पूरे संग्रह को पुन: सक्रिय नहीं करेगी, लेकिन केवल तब तक जब तक मानदंड को पूरा करने वाला पहला तत्व नहीं मिलता है।

अन्यथा आपको शायद एक पूर्वानुमान इंटरफेस और फ़िल्टरिंग विधि को लागू करना होगा।

interface Predicate<T> { 
    public boolean eval(T o); 
} 

public static void main(String[] args) { 
    final String x = "Obi-wan"; //this is the item subject to eval addition 
    List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin")); 
    Predicate<String> p = new Predicate<String>() { 
     public boolean eval(String s){ 
      return distance(s, x) >= 3; 
     } 
    }; 
    if(filter(items, p).isEmpty()){ 
     items.add(x); 
    } 
} 

public static <T> List<T> filter(List<? extends T> items, Predicate<? super T> predicate){ 
    List<T> destiny = new ArrayList<T>(); 
    for(T item : items){ 
     if(predicate.eval(item){ 
      destiny.add(item); 
     } 
    } 
    return destiny; 
} 

वैकल्पिक रूप से, आप अपने मानदंडों को पूरा करने वाले पहले आइटम को खोजने के बाद फ़िल्टरिंग बंद कर सकते हैं।

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