我有一个名为 self.objectArray
的 NSMutableArray
,它包含自定义对象。每个对象都包含一个 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;
}];
最佳答案
我会考虑使用 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 可能非常昂贵并且会导致严重的性能损失。
关于ios - 根据对象的内容对 NSMutableArray 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614549/