根据NSMutableArray对象的内容对其进行排序

时间:2014-07-07 15:43:38

标签: ios objective-c

我有NSMutableArray名为self.objectArray,其中包含自定义对象。每个对象包含一个NSDictionary和另外两个字符串对象。实际上我只需要使用字典。每个字典都包含一个名为keyDate的密钥,其中包含NSString,如下所示:MM/dd/yy HH:mm:ss

我想根据他们的keyDate对数组进行排序。具有最早日期的对象应该是第一个对象,依此类推。我发现了一些看似有用的问题,我可以创建下面你可以看到的代码,但每次运行它都会出错。我认为NSSortDescriptor不是正确的工具,因为我的密钥不符合密钥值。

PNMessage 0x125c0590> valueForUndefinedKey:]: this class is not key value coding-compliant for the key keyDate.'

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
                                    sortDescriptorWithKey:@"keyDate"
                                    ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [self.objectArray
                             sortedArrayUsingDescriptors:sortDescriptors];

self.finallySorted = [sortedEventArray mutableCopy];

如果可能,我会用排序描述符来做,但我认为应该有其他一些选项,但无法弄清楚它的正确实现。

所以我也可以通过for循环捕获每个对象keyDate,但不知道如何根据值对它们进行排序。如果有人能以正确的方式向我展示,我真的很感激。

 for(PNMessage *mg in self.objectArray)

        {
           NSLog(@" test log %@", mg.message[@"keyDate"]);
        }

我已经检查了这个答案: How to sort an NSMutableArray with custom objects in it?

但我的对象结构不同。

我的第一个代码基于这个问题,但它没有奏效。 How to sort an NSMutableArray with custom objects in it?

更新:我的尝试基于Kaan的答案(目前尚无效)

    static NSDateFormatter *formatter = nil;
if(!formatter) {
    formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yy HH:mm:ss"];
}
NSArray *sortedArray = [self.object sortedArrayUsingComparator:^NSComparisonResult(PNMessage *obj1, PNMessage *obj2) {
    NSString *date1String = obj1.message[@"keyDate"];
    NSString *date2String = obj1.message[@"keyDate"];
    NSDate *date1 = [formatter dateFromString:date1String];
    NSDate *date2 = [formatter dateFromString:date2String];

    if ( date1 < date2 ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( date1 > date2 ) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

1 个答案:

答案 0 :(得分:2)

我会考虑使用sortedArrayUsingComparator方法

假设您的自定义类名为PNMessage:

static NSDateFormatter *formatter = nil;
if(!formatter) {
formatter = [[NSDateFormatter alloc] init];
[formatter setFormat:@"MM/dd/yy HH:mm:ss"];
}
NSArray *sortedArray = [self.objectArray sortedArrayUsingComparator:^NSComparisonResult(PNMessage *obj1, PNMessage *obj2) {
    NSString *date1String = obj1[@"keyDate"];
    NSString *date2String = obj1[@"keyDate"];
    NSDate *date1 = [formatter dateFromString:date1String];
    NSDate *date2 = [formatter dateFromString:date2String];

    return [date1 compare:date2];
}];

提示:如果你决定这样做,请确保在排序主体之外将NSDateFormatter实例声明为静态,因为在iOS中分配Formatters可能非常昂贵并导致严重的性能损失。