我有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;
}];
答案 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可能非常昂贵并导致严重的性能损失。