使用NSSortDescriptor时发现了一些错误

时间:2012-08-19 15:32:25

标签: iphone ios xcode nsdate nssortdescriptor

我使用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看到许多其他帖子与我上面的代码类似,但它们似乎没有任何错误。对我来说,它只按当天而不是月份排序!我所做的是对距离较近的对象进行排序。谢谢!

2 个答案:

答案 0 :(得分:1)

您展示的排序顺序实际上是正确的。问题是你要排序字符串而不是日期。如果可能,请使用date的实例填充NSDate属性,而不是NSString的实例,然后排序将按预期执行。

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

答案 1 :(得分: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
}