繁体   English   中英

按NSDate属性对自定义对象的NSArray进行排序

[英]Sort NSArray of custom objects by their NSDate properties

我正在尝试对填充了自定义对象的NSArray进行排序。 每个对象都有一个属性为startDateTime ,类型为NSDate。

以下代码生成一个数组, sortedEventArray ,已填充但未排序。 我是以完全错误的方式解决这个问题,还是我错过了一些小事?

NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime" 
                                                                 ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors];

您确定节点事件的startDateTime实例变量是非零吗?

如果你没有一个已经,您可以添加一个(自定义) -description方法,做这样的事情您的节点事件对象:

- (NSString *)description {
   return [NSString stringWithFormat:@"%@ - %@",
                   [super description], startDateTime]];
}

然后在你的排序代码中记录之前和之后的数组:

NSLog(@"nodeEventArray == %@", nodeEventArray);
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
                                     sortDescriptorWithKey:@"startDateTime" 
                                                 ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray
         sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@"sortedEventArray == %@", sortedEventArray);

如果startDateTime都是nil ,那么before和after数组将具有相同的顺序(因为排序操作将等同于将所有-compare: messages发送到nil ,这基本上什么都不做)。

好的,我知道这有点晚了,但我就是这样做的:

NSArray *sortedEventArray = [events sortedArrayUsingComparator:^NSComparisonResult(Event *event1, Event *event2) {
    return [event1.startDateTime compare:event2.startDateTime];
}];

显然,将Event替换为自定义对象的类。 这种方法的优点是可以防止将来的重构。 如果您要重构并将startDateTime属性重命名为其他内容,Xcode可能不会更改您传递给排序描述符的字符串。 突然间,您的排序代码会中断/不执行任何操作。

您是否尝试指定NSDate比较器?

例如:

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
   sortDescriptorWithKey:@"startDateTime"
   ascending:YES
   selector:@selector(compare:)];

这应该强制使用NSDate类的正确比较器。

你可以这样做,

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE];

[self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

你可以这样做,

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField"  ascending:YES];

NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM