2011-11-08 8 views
18

मुझे से NSNumber एस की सॉर्टेड सरणी उत्पन्न करने की आवश्यकता है। मैं विधि का उपयोग करना चाहता हूं। मैं एप्पल दस्तावेज में इस उदाहरण पाया:सॉर्ट ऑर्डर को बदलना - [एनएसएआरएआरए सॉर्टेडएरेयू यूजिंगकंपेटर:]

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 

यहाँ मैं सिर्फ एक ब्लॉक है, जो ठीक है में तुलनित्र प्रदान कर रहा हूँ। खुद को क्रमबद्ध करें - जो बिट मुझसे छिपा हुआ है, जो इस ब्लॉक का उपयोग करता है - आरोही प्रतीत होता है।

मैं अगर मैं इस ब्लॉक के लिए एक अलग सॉर्ट क्रम बाहरी अनुरोध कर सकते हैं जानना चाहते हैं, या मैं बस के चारों ओर < और > के (या NSOrderedXXX के) फ्लिप करने की जरूरत है होगा?

उत्तर

24

यदि आप अवरोही क्रमबद्ध करना चाहते हैं, तो बस तुलना को फ्लिप करें (या NSComparisonResult एस फ्लिप करें)। जब आप सीधे ब्लॉक में इसे नियंत्रित कर सकते हैं तो ascending: पैरामीटर होने पर API को फूला करने की आवश्यकता नहीं है।

4

बस तर्क बदलने के लिए: decendingSort:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 

if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
} 

if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
} 
return (NSComparisonResult)NSOrderedSame; 
}]; 

स्पष्टता के लिए यह इस के समान नाम के साथ एक विधि बनाने के लिए सबसे अच्छा हो सकता है।

+1

, लेकिन जब तक आप नारंगी के साथ इसे सजाने रेड-जीसस-क्राइस्ट-इंक में लिखा गया ट्रैफिक-कॉन टिप्पणियां बताती हैं कि आपने ऑर्डर को फ़्लिप कर दिया है, कुछ बिंदु बाद यह एक संभावित डिबगिंग दुःस्वप्न हो सकता है। एक प्रकार का वर्णनकर्ता बनाना अधिक समझदार होगा और जब तक प्रदर्शन गंभीर हिट नहीं करेगा तब तक स्वयं-टिप्पणी करें। –

+0

@God एक प्रकार का वर्णनकर्ता महान लगता है, कृपया तुलना के लिए एक कार्यान्वयन उदाहरण प्रदान करें। – zaph

4

-sortedArrayUsingComparator: के लिए दस्तावेज़ से:

"एक सरणी के रूप में एक दिया NSComparator ब्लॉक द्वारा निर्दिष्ट तुलना विधि द्वारा निर्धारित किया जाता है कि, आरोही क्रम में प्राप्त सरणी के तत्वों को सूचीबद्ध करता है देता है।"

तो आप

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

उपयोग करने के लिए लेकिन निश्चित अपने स्वयं के NSSortDescriptor रोलिंग का मतलब है कि का सहारा लेना होगा पहला वस्तुओं, जो अपने उद्देश्यों के ठीक सूट कर सकते हैं।

+0

+1 यह इंगित करने के लिए कि वास्तव में, यह दस्तावेज है। चीयर्स जेफ –

4

आप ऑपरेटरों को चारों ओर फ़्लिप कर सकते हैं।

"जो बिट आपको छिपा हुआ है" को आरोही या अवरोही की परवाह नहीं है, क्योंकि यह आपकी वस्तुओं के बारे में कुछ नहीं जानता है। यह आपके सहकर्मी से पूछना है कि अगर हॉकी पक एक मस्करा से बड़ा या उससे कम है। आंतरिक कार्यान्वयन केवल एक सॉर्टिंग एल्गोरिदम का उपयोग करता है (जो शायद आपके सरणी के आकार का उपयोग करके निर्धारित किया जाता है) और दो ऑब्जेक्ट्स की तुलना करने के लिए आपके ब्लॉक फ़ंक्शन का उपयोग करता है।

4

एक तरफ ध्यान दें के रूप में, आप इस

[[NSArray reverseObjectEnumerator] allObjects];

स्रोत का उपयोग कर एक सरणी के उलट आदेश प्राप्त करने में सक्षम हैं: https://stackoverflow.com/a/586529/1382210

बेशक यह ठीक है