【问题标题】:Some errors spotted while using NSSortDescriptor使用 NSSortDescriptor 时发现的一些错误
【发布时间】:2012-08-19 15:32:24
【问题描述】:

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

【问题讨论】:

  • 键“date”的值是日期对象还是字符串?
  • 它实际上是从一个 plist 中检索的,一个字符串。但我不知道如何将其转换为 NSdate。嗯..愿意分享吗?:)
  • 我获取字符串,转换为 NSDate,然后在排序之前将其添加回数组中还是??
  • 最简单的方法是转换为日期然后排序,然后再转换回字符串(如果您需要它是字符串)。否则,您将不得不编写自定义排序器。
  • 最简单的解决方案是将日期编码为 YYYY/MM/DD。

标签: iphone ios xcode nsdate nssortdescriptor


【解决方案1】:

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

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

【讨论】:

  • 实际上我已经尝试过使用 sortedArrayUsingComparator:caseInsensitiveCompare 但它也不起作用..嗯..
  • 不清楚你在说什么。 caseInsensitiveCompare: 是一个方法,而不是一个块。 sortedArrayUsingComparator: 方法需要一个块作为参数。如果您不熟悉块,这里是 Apple 的 Blocks Programming Topics 指南的链接。但是,将基础属性类型更改为 NSDate 会比实现自定义比较器更好(且更简单)地解决您的问题。
【解决方案2】:

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

【讨论】:

  • OP 的问题不是如何对字符串数组进行排序,而是如何根据日期属性对对象数组进行排序。
  • 感谢您的澄清。但仍然在这种情况下,上述逻辑将被实现,只需将快速枚举对象 NSString 更改为 NSDictionary 或任何相关的 K-V 对象...
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
相关资源
最近更新 更多