2011-08-17 45 views
5

Tôi có NSMutableArray chứa 2 loại đối tượng.Sắp xếp NSmutableArray có chứa 2 loại đối tượng?

Cả hai đối tượng đều chứa trường cho ngày tháng (ngày tháng có định dạng khác nhau) với các tên khác nhau.

Cách tốt nhất và nhanh nhất để sắp xếp tất cả dựa trên ngày là gì? Có thể sử dụng số NSSortDescriptor trong trường hợp này không?

Trả lời

4

Nếu bạn đang nhắm mục tiêu Mac OS X v10.6 hoặc iOS4 và cao hơn bạn có thể sắp xếp sử dụng so sánh tương tự như sau

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]; 
}]; 

Bên cạnh việc kiểm tra cho lớp bạn cũng có thể kiểm tra xem nó phản ứng với Selector.

+2

đúc các đối tượng từ 'id' là khá cần thiết. – Chuck

+0

Vâng, có một số phương pháp "sortUsing ..." trên NSArray, và bất kỳ một trong số họ nên thực hiện công việc. –

+0

BTW - không cần chạy 'isKindOfClass:' hoặc 'respondsToSelector:' nếu bạn sử dụng các danh mục. – nielsbot

1

Bạn có thể thêm danh mục để hợp nhất tên trường ngày. Hãy nói rằng trường lớp Một có một cái trường "dateString" và trường lớp B có một trường "creationDateString" ... Bạn có thể làm điều này:

@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 

Bây giờ bạn có thể sắp xếp tất cả các đối tượng trong mảng của bạn bằng cách sở hữu sortDate của họ:

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

EDIT Hoặc với một mô tả loại:

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

bạn thậm chí có thể tạo lưu trữ cho mỗi cá thể cho thuộc tính 'sortDate' mới của bạn để nó chỉ cần được tính toán lại với chuỗi cơ bản thay đổi. – nielsbot

Các vấn đề liên quan