对包含两种对象的NSmutableArray进行排序?

5

我有一个包含两种类型对象的NSMutableArray。

这两种对象都包含一个日期字段(使用不同格式的日期字符串),并且字段名称不同。

如何基于日期对它们进行最佳和最快的排序?在这种情况下,是否可以使用NSSortDescriptor?

2个回答

4
如果您的目标是 Mac OS X 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
是的,NSArray 上有几个“sortUsing…”方法,其中任何一个都可以完成工作。 - Hot Licks
顺便说一句 - 如果您使用类别,则无需运行 isKindOfClass:respondsToSelector: - nielsbot

1

您可以添加一个类别来统一日期字段名称。比如说,A类的实例有一个字段叫做“dateString”,而B类的实例有一个字段叫做“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 ] ] ] ;

你甚至可以为新的 sortDate 属性创建每个实例的存储,这样它只需要在基础字符串更改时重新计算。 - nielsbot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接