2009-07-21 18 views
16

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

उदाहरण के लिए, यदि सरणी/सेट के मान [@"a", @"b", @"b", @"c"] हैं, तो अंतिम परिणाम [@"a", @"b", @"c"] होना चाहिए।

चूंकि मैं NSStrings की तुलना कर रहा हूं, इसलिए मैं isEqualTo: विधि का उपयोग कर रहा हूं यह जांचने के लिए कि तार बराबर हैं या नहीं।

क्या उन सभी के माध्यम से लूप की तुलना में डुप्लिकेट प्रविष्टियों को निकालने का एक और अधिक प्रभावी तरीका है और जांचें कि डुप्लिकेट मौजूद है या नहीं?

उत्तर

42

एक NSSet वही करता है जो आप करने की कोशिश कर रहे हैं: यह अद्वितीय वस्तुओं का एक (अनियंत्रित) संग्रह है। (एन^2) यदि प्रत्येक आइटम है की जाँच करने के

NSSet *uniqueElements = [NSSet setWithArray:myArray]; 

// iterate over the unique items 
for(id element in uniqueElements) { 
    // do something 
} 

NSSet सबसे अधिक संभावना प्रविष्टि हे (1) (हे की तुलना में बनाने के लिए एक हैश एल्गोरिथ्म का उपयोग करता: तो, तुम इतनी तरह अपने सरणी में अद्वितीय आइटम प्राप्त कर सकते हैं पुनरावृत्ति द्वारा अनूठा), लेकिन ऐप्पल दस्तावेज ऐसी गारंटी नहीं देता है, इसलिए आपको उस कार्यान्वयन के विवरण पर भरोसा नहीं करना चाहिए।

यदि किसी कारण से आपको अनन्य वस्तुओं को एक क्रमबद्ध (आदेशित) संग्रह में रखने की आवश्यकता है, तो आप सेट को वापस -[NSSet allObjects] के साथ सरणी में बदल सकते हैं और फिर परिणामी सरणी को सॉर्ट कर सकते हैं।

+0

धन्यवाद, यह काम किया! मैंने सरणी में अद्वितीय तत्व प्राप्त करने के लिए यह किया: // अद्वितीय तत्व नामों की जांच के लिए सेट करने के लिए जोड़ें एनएसएससेट * अद्वितीय नाम = [एनएसएससेट सेटविथअरे: नाम]; \t // वापस डेटा वापस सरणी नाम = [[एनएसएमयूटेबलएरे ऐलोक] initWithArray: [अद्वितीय नाम सभी ऑब्जेक्ट्स]]; – Rudi

+0

सरणी नामों पर वापस जाने के लिए और अधिक तोपयोगी तरीका होगा: आईडी नाम = [[अद्वितीय नाम सभी ऑब्जेक्ट्स] बनाए रखें]; // यदि आप नाम या आईडी नाम = [अद्वितीय नाम सभी ऑब्जेक्ट्स] रखना चाहते हैं; // यदि आप सरणी –

+0

के स्वामित्व को बनाए रखना नहीं चाहते हैं @ बैरीवार्क यह पुनरावृत्ति के लिए ओ (एन) नहीं होगा? – Peres

3

एक सेट में डुप्लिकेट तत्व कभी नहीं होते हैं, इसलिए बस NSMutableSet बनाना मूल्यों की विशिष्टता की गारंटी देना चाहिए।

+0

उत्तर डैनियल के लिए धन्यवाद! – Rudi

4

एक NSSet या NSMutableSet गारंटी देगा कि आपके पास डुप्लिकेट ऑब्जेक्ट्स नहीं हैं। यह आपके उदाहरण में NSStrings के लिए काम करेगा, लेकिन आपके स्वयं के वर्गों के लिए ध्यान रखें कि "बराबर" से आपका क्या मतलब है और hash और isEqual: विधियों को लागू करें।

+0

स्पष्टीकरण के लिए धन्यवाद, यह जानना अच्छा है कि यह NSStrings के लिए स्वचालित है। – Rudi

1

केवल कोड की यह पंक्ति ठीक काम करेगी।

NSSet *mySet = [NSSet setWithArray:myArray]; 

अब mySet में अद्वितीय तत्व होंगे।

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