2011-08-17 13 views
5

मेरे पास एक एनएसएमयूटेबलएरे है जिसमें 2 प्रकार के ऑब्जेक्ट हैं।NSmutableArray सॉर्ट करें जिसमें 2 प्रकार की ऑब्जेक्ट है?

दोनों ऑब्जेक्ट्स अलग-अलग नामों के साथ तिथियों (विभिन्न प्रारूपों के साथ स्ट्रिंग्स) के लिए एक फ़ील्ड शामिल हैं।

तारीख के आधार पर उन सभी को क्रमबद्ध करने का सबसे अच्छा और तेज़ तरीका क्या है? क्या इस स्थिति में NSSortDescriptor का उपयोग करना संभव है?

उत्तर

4

आप मैक ओएस एक्स v10.6 या iOS4 और लक्षित कर रहे हैं उतना ही अधिक वर्ग आप भी अगर यह चयनकर्ता का जवाब की जांच कर सकता के लिए जाँच के अलावा समान तुलनित्र का उपयोग कर इस

NSDateFormatter *formatter1 = ...; //create and configure date formatter for Class1 
NSDateFormatter *formatter2 = ...; //create and configure date formatter for Class2 


[arrayOfObjects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSDate *date1 = nil, *date2 = nil; 
    //Get first objects date 
    if([obj1 isKindOfClass:[Class1 class]]) 
    { 
     date1 = [formatter1 dateFromString:[obj1 class1Date]]; 
    } 
    else if([obj1 isKindOfClass:[Class2 class]]) 
    { 
     date1 = [formatter2 dateFromString:[obj1 class2Date]]; 
    } 

    //Get second objects date 
    if([obj2 isKindOfClass:[Class1 class]]) 
    { 
     date2 = [formatter1 dateFromString:[obj2 class1Date]]; 
    } 
    else if([obj2 isKindOfClass:[Class2 class]]) 
    { 
     date2 = [formatter2 dateFromString:[obj2 class2Date]]; 
    } 

    NSAssert(date1 != nil, @"Could not parse date from %@", obj1); 
    NSAssert(date2 != nil, @"Could not parse date from %@", obj2); 

    return [date1 compare:date2]; 
}]; 

को सॉर्ट कर सकते हैं।

+2

'id' से वस्तुओं कास्टिंग काफी अनावश्यक है। – Chuck

+0

हां, एनएसएआरएआरई पर कई "sortUsing ..." विधियां हैं, और उनमें से किसी एक को नौकरी करना चाहिए। –

+0

बीटीडब्लू - 'isKindOfClass:' या 'प्रतिक्रियाओं को चुनने की कोई ज़रूरत नहीं है:' अगर आप श्रेणियों का उपयोग करते हैं .. – nielsbot

1

आप दिनांक फ़ील्ड नाम को एकीकृत करने के लिए एक श्रेणी जोड़ सकते हैं। मान लीजिए कि वर्ग एक के उदाहरणों एक क्षेत्र "डेटस्ट्रिंग" और वर्ग बी के उदाहरण सामने एक क्षेत्र "creationDateString" करते हैं ... आप ऐसा कर सकता है:

@implementation A (SortByDate) 

-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.dateString ] ; 
} 
@end 

@implementation B (SortByDate) 
-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.creationDateString ] ; 
} 
@end 

अब आप अपने sortDate संपत्ति के आधार पर आपके सरणी में सभी वस्तुओं को सॉर्ट कर सकते हैं:

NSArray * sortedByDateArray = [ unsortedArray sortedArrayUsingComparator:^(id a, id b){ 
    return [ [ a sortDate ] compare:[ b sortDate ] ] ; 
}]; 

संपादित या एक तरह से वर्णनकर्ता के साथ:

NSArray * sortedArray = [ unsortedArray sortedArrayUsingDescriptors:[ NSArray arrayWithObject:[ NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:YES ] ] ] ; 
+0

आप अपनी नई 'सॉर्टडेट' संपत्ति के लिए प्रति-आवृत्ति भंडारण भी बना सकते हैं, इसलिए इसे केवल अंतर्निहित स्ट्रिंग के साथ पुनः संयोजित करने की आवश्यकता है परिवर्तन। – nielsbot

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