2012-02-11 12 views
12

मैं अभी भी उद्देश्य-सी के लिए नया हूं और यह पता लगाने की कोशिश कर रहा हूं कि यह कथन वास्तव में क्या कर रहा है।सॉर्ट किया गया एरियाउसेलिंग चयनकर्ता क्या कर रहा है?

[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

मुझे पता है कि allKeys मेरे शब्दकोश से सभी चाबियाँ मिल रही हैं। मुझे पता है कि sortedArrayUsingSelector मेरी सरणी बनाने के लिए सॉर्ट कर रहा है। फिर मैं तुलना विधि को बुला रहा हूं, यही वह जगह है जहां मैं खो गया हूं यह क्या कर रहा है? सेब पर दस्तावेज़ से यह कहता है कि "एक एनएससीओम्परिसन रिसेट मूल्य देता है जो इंगित करता है कि रिसीवर किसी दिए गए नंबर से अधिक, बराबर या उससे कम है या नहीं।" मैं समझ नहीं पा रहा हूं कि यह उस विधि के आधार पर कैसे क्रमबद्ध है।

उत्तर

22
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

उपरोक्त कोड आपके द्वारा प्रदान किए गए चयनकर्ता का उपयोग करके शब्दकोश कुंजी की एक क्रमबद्ध सरणी देता है। चयनकर्ता वास्तव में वह फ़ंक्शन है जिसे उस ऑब्जेक्ट पर बुलाया जाएगा जिसे आपके सरणी में सॉर्ट किया जा रहा है। इस मामले में अपने सरणी तार वास्तविक NSArray छँटाई कोड निम्न हो रहा हो जाएगा में ऐसा है, तो

//... 
[key1 compare:key2]; 
//.. 

आप एक अलग चयनकर्ता में पारित कर दिया है, तो कहते हैं कि @selector (randomFunction :) तो छँटाई कोड में निम्नलिखित की सुविधा देता है शामिल होगा

//.. 
[key1 randomFunction:key2]; 
//.. 

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

एक सरणी को सॉर्ट करने का एक बेहतर तरीका ब्लॉक स्टेटमेंट का उपयोग करना है।

id mySort = ^(NSString * key1, NSString * key2){ 
    return [key1 compare:key2]; 
}; 


NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort]; 

कारण यह बेहतर तरीका है कि किसी ऑब्जेक्ट को सॉर्ट करना बहुत आसान है।

id mySort = ^(MyObject * obj1, MyObject * obj2){ 
    return [obj1.title compare:obj2.title]; 
}; 


NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort]; 
+0

+1 - अच्छी व्याख्या – bryanmac

5
- (NSComparisonResult)compare: 
{ 
    // if (value of firstObject) < (value of secondObject) 
     // return NSOrderedAscending 
    // else if (value of firstObject) == (value of secondObject) 
     // return NSOrderedSame 
    // else 
     // return NSOrderedDescending 
} 
0

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

आपने माना है कि सॉर्ट किया गया हैअरेयूयूइंग सिलेक्टर कोड के भाग compare: से अलग है। यह मामला नहीं है। compare: चयनकर्ता है जो सरणी को सॉर्ट करने के लिए उपयोग किया जाता है।

सॉर्टिंग विधि आपको एक सरणी देता है जहां प्रत्येक तत्व, जब निर्दिष्ट चयनकर्ता और सरणी में अगला तत्व भेजा जाता है, तो सही सॉर्ट ऑर्डर देता है।

एनएसएआरएआरई कैसे प्राप्त करता है यह सार्वजनिक नहीं है लेकिन रूट पर, आपके द्वारा परिभाषित चयनकर्ता का उपयोग सरणी के भीतर से वस्तुओं के जोड़े की तुलना करने के लिए किया जाता है, जिसके परिणामस्वरूप क्रमबद्ध सरणी में उनके प्लेसमेंट को सूचित किया जाता है।

3

-sortedArrayUsingSelector: सरणी में वस्तुओं पर विधि: अपने उदाहरण में विधि -compare कहता है। कुछ ऑब्जेक्ट्स के लिए ऐप्पल ने पहले से ही -compare: विधि लागू की है, उदाहरण के लिए यदि आप the NSString documentation के माध्यम से पढ़ते हैं, तो आपको -compare: विधि लागू की जाएगी। यदि आप इन ऑब्जेक्ट्स में एक तुलना विधि लागू कर चुके हैं तो आप अपनी कस्टम ऑब्जेक्ट्स पर कस्टम तुलना विधियों को भी कॉल कर सकते हैं। कृपया ध्यान दें कि तुलना विधि को -compare: कहा जाना चाहिए, महत्व का केवल वापसी मूल्य (एनएससीओपरिसन रीसेट) और विधि प्राप्त करने वाली वस्तु है।

0

नई सरणी में प्राप्तकर्ता सरणी के तत्वों के संदर्भ शामिल हैं, न कि उनकी प्रतियां।
तुलनित्र संदेश सरणी में प्रत्येक ऑब्जेक्ट को भेजा जाता है और इसके एकल तर्क के रूप में सरणी में एक और वस्तु होती है।
उदाहरण के लिए, एनएसएसटींग ऑब्जेक्ट्स की एक सरणी को केस इन्सेंसिटिव कॉम्पैयर का उपयोग करके सॉर्ट किया जा सकता है: एनएसएसटींग क्लास में घोषित विधि। मान लें कि एरेरे का अस्तित्व है, इस तरह से सरणी का एक क्रमबद्ध संस्करण बनाया जा सकता है:

NSArray *sortedArray = 
    [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
संबंधित मुद्दे