2009-09-17 14 views
50

से अद्वितीय मूल्य प्राप्त करना मेरे पास NSArray एक कस्टम क्लास की ऑब्जेक्ट्स के साथ बनाया गया है। कक्षा में 3 (शहर, राज्य, ज़िप) स्ट्रिंग गुण हैं। मैं array से सभी अद्वितीय राज्य मान प्राप्त करना चाहता हूं।आईफोन - एनएसएआरएआरई ऑब्जेक्ट

मैंने NSPredicate कक्षा के माध्यम से पढ़ा था लेकिन इस मामले में इसका उपयोग कैसे किया जा सकता है। स्ट्रिंग ऑपरेशंस के लिए मुझे मिल सकने वाले एकमात्र उदाहरण थे।

क्या कोई मेरी मदद कर सकता है?

उत्तर

117

पूरी तरह से सरल एक लाइनर:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]]; 

चाल NSArray की valueForKey: तरीका है। यह आपके सरणी (myArrayOfCustomObjects) के माध्यम से फिर से शुरू होगा, प्रत्येक ऑब्जेक्ट पर -state विधि को कॉल करें, और परिणामों की एक सरणी बनाएं। इसके बाद हम डुप्लिकेट को हटाने के लिए राज्यों के परिणामस्वरूप सरणी के साथ NSSet बनाते हैं।


iOS 5 और OS X 10.7 के साथ शुरू, वहाँ एक नया वर्ग है कि इस के रूप में अच्छी तरह से कर सकते हैं: NSOrderedSet। आदेशित सेट का लाभ यह है कि यह किसी भी डुप्लीकेट को हटा देगा, लेकिन सापेक्ष आदेश भी बनाएगा।

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"]; 
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states]; 
NSSet *uniqueStates = [orderedSet set]; 
+0

जबकि मैं भी @distinctUnionOfObjects की शक्ति, और इसलिए, इस सवाल का जवाब उपयोगकर्ता probablyCorey दिया था, इस समाधान में इस संक्षिप्त दृष्टिकोण यहाँ के साथ लाभ की तरह क्या यह आदेश संरक्षित है। – idStar

134

keypaths पर एक नज़र डालें। वे बहुत शक्तिशाली हैं और मैं ज्यादातर समय एनएसपीडिकेट कक्षाओं के बजाय उनका उपयोग करता हूं। इस तरीके से उन्हें अपने उदाहरण में प्रयोग करेंगे है ...

NSArray *uniqueStates; 
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"]; 

नोट valueForKeyPath बजाय valueForKey का उपयोग।

यहां पर विस्तृत/काल्पनिक उदाहरण है ...

NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil]; 
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil]; 
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil]; 
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil]; 

NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil]; 

NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]); 

// OUTPUT 
// Unique States: 
// "california", 
// "michigan", 
// "new york" 
+17

चेतावनी: valueForKeyPath: @ "@ individualUnionOfObjects.PROPERTY" सॉर्ट ऑर्डर को सुरक्षित नहीं करता है। –

+0

धन्यवाद @RobertAltman, यह इंगित करने के लिए। मुझे लगता है कि मुझे कुछ डिबगिंग समय बचाया – Hulvej

+0

क्या होगा यदि ऑब्जेक्ट की कुंजी एक सरणी है और मान इसकी पहली अनुक्रमणिका पर मौजूद है? –

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