0

我使用 NSSortDescriptor 以日期为键对对象进行排序。我的代码:

 NSLog(@"Before sorting: %@", temp);
    NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"date" ascending: YES];
    NSArray *sortedArray2 = [temp sortedArrayUsingDescriptors:[NSArray arrayWithObject: dateSortDescriptor]];
    NSLog(@"After sorting: %@", sortedArray2);
    NSMutableArray *afterSorting = [[(NSArray*)sortedArray2 mutableCopy]autorelease];

当日期是

22/08/2012
23/08/2012
25/09/2012

但是,我发现 NSSortDescriptor 似乎只按前面的前两个数字排序,因为当我的日期稍微改变时,我的结果变成了这样:

10/09/2012
22/08/2012
23/08/2012

有人可以请教吗?看到许多其他使用 NSSortDescriptor 的帖子与我上面的代码类似,但它们似乎在任何地方都没有错误。对我来说,它只按天排序,而不是按月排序!我所做的是对日期较近的对象进行排序。谢谢!

4

2 回答 2

1

您显示的排序顺序实际上是正确的。问题是您正在排序字符串而不是日期。如果可能,请使用 的实例而不是 的实例填充date属性,然后排序将按照您的预期进行。NSDateNSString

如果由于某种原因您不能NSDatedate属性中使用实例(这看起来有点奇怪,但谁知道),您可以改为通过向数组发送sortedArrayUsingComparator:消息来对数组进行排序,并传入一个定义自定义排序的块。

于 2012-08-19T16:00:16.263 回答
0

排序工作正常,因为它只比较字符串。因此,您首先需要将 NSDate 转换为 NSString,然后对 NSDate 进行排序操作,然后恢复为排序后的日期字符串数组,如下所示:

- (NSArray *) sortArrayOfDateStrings:(NSArray*)array {

NSMutableArray *sortedArray = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *sortedDateArray = [NSMutableArray arrayWithCapacity:0];
NSDate *dateObject;

for(NSString *dateString in array){

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"dd/MM/yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];

dateFromString = [dateFormatter dateFromString:dateString];
[dateFormatter release];

[sortedArray addObject:dateFromString];
}

NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"date" ascending: YES];
[sortedDateArray addObjectsFromArray:[sortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject: dateSortDescriptor]]];

[sortedArray removeAllObjects];

for (NSDate* sortedDate in sortedDateArray){

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
NSString *strDate = [dateFormatter stringFromDate:sortedDate];
NSLog(@"%@", strDate);
[dateFormatter release];

[sortedArray addObject:strDate];
}

return sortedArray
}
于 2012-08-19T19:22:33.380 回答