Iphone 使用NSSortDescriptor时发现的一些错误

Iphone 使用NSSortDescriptor时发现的一些错误,iphone,ios,xcode,nsdate,nssortdescriptor,Iphone,Ios,Xcode,Nsdate,Nssortdescriptor,我使用NSSortDescriptor以日期为键对对象进行排序。我的代码: NSLog(@"Before sorting: %@", temp); NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"date" ascending: YES]; NSArray *sortedArray2 = [temp sortedArrayUsingDescriptors:[NSA

我使用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,就像上面我的代码一样,但它们似乎在任何地方都没有错误。对我来说,它只按天排序,不按月排序!我所做的是对顶部日期较近的对象进行排序。谢谢

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


如果出于某种原因,您不能在
date
属性中使用
NSDate
实例(这似乎有点奇怪,但谁知道呢),您可以通过发送
sortedarrayingcomparator:
消息并传入定义自定义排序的块来对数组进行排序。

排序工作正常,因为它只比较字符串。因此,您首先需要将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
}

键“date”的值是一个日期对象还是一个字符串?它实际上是从一个plist,一个字符串中检索的。但我不知道如何将其转换为NSdate。隐马尔可夫模型。。是否要共享?:)我是否获取字符串,转换为NSDate,然后在排序之前将其添加回数组?或者?转换为日期,然后进行排序,然后再转换回字符串(如果需要将其转换为字符串)是最简单的方法。否则,您必须编写自定义排序器。最简单的解决方案是对日期YYYY/MM/DD进行编码。OP的问题不是如何对字符串数组进行排序,而是如何根据日期属性对对象数组进行排序。感谢您的澄清。但在这种情况下,上述逻辑仍将实现,只需将快速枚举对象NSString更改为NSDictionary或任何相关的K-V对象……实际上,我已经尝试使用SorterDarray使用Comparator:caseInsensitiveCompare,但它不起作用。。嗯,你说的不清楚<代码>区分大小写比较:是一种方法,而不是块。
sortedarrayingcomparator:
方法需要一个块作为参数。如果你不熟悉积木,这里有一个苹果指南的链接。但是,将底层属性类型更改为
NSDate
将是比实现自定义比较器更好(更简单)的解决方案。