如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?

Posted

技术标签:

【中文标题】如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?【英文标题】:How to split up NSArray into NSDictionary by array object's NSDate day of year? 【发布时间】:2010-11-21 15:21:02 【问题描述】:

我有一个 NSArray,我按其对象的“已发布”属性以降序对它进行排序,最新的在前:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"published" ascending:YES];
NSArray *descps = [[NSArray alloc] initWithObjects:[sortDescriptor reversedSortDescriptor], nil];
[storiesLocal sortUsingDescriptors:descps];
[descps release];
[sortDescriptor release];

所以现在,我想每天拆分这个数组,这样我就可以将它与 UITableView 一起使用。在我的示例中,每个日期都是 tableview 部分标题。 因此,如果我的示例排序数组 (storiesLocal) 的日期如下:

2010-04-05 10:32:00
2010-04-05 06:20:12
2010-04-02 09:23:02
2010-04-02 03:20:34
2010-04-01 04:22:34

然后我会有像“4 月 5 日”、“4 月 2 日”、“4 月 1 日”这样的表格视图标题。因此,每个对应的标题下都有 2、2 和 1 行

基本上,我想要的结果是一个 NSDictionary。每个键都是一个日期(2010-04-02),每个值都是一个包含正确对象的 NSArray。所有这些都应按日期排序。最新的优先。

我经历了大约 3 次尝试,每次都失败,最终删除了我编写的代码。

编辑:由于 NSDictionary 是一个无序列表,最好有一个字典数组,每个字典都包含一个日期键和一个故事数组键,因为顺序非常重要。

【问题讨论】:

【参考方案1】:

这未经测试,但尝试类似:

NSArray *descps as above.

NSDateFormatter *in_formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSDateFormatter *out_formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM d"];

NSString *todayStr =
[formatter release];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

for (ObjectType *obj in descps) 
  NSDate *date = [in_formatter dateFromString:[obj published]];
  NSString *day = [out_formatter stringFromDate:date];

  NSArray *array = [dict valueForKey:day];
  if (array == nil) 
    array = [[NSMutableArray alloc] init];
    [dict setValue:array forKey:day];
    [array release];
  

  [array addObject:obj];


[in_formatter release];
[out_formatter release];

【讨论】:

以上是关于如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RestKit 将日期组件字典映射到 NSDate

如何通过 NSDate 属性过滤 Realm 对象

如何通过 NSDate 属性对 NSMangedObjects 进行排序

如何创建代表下一个指定日期时间的完整 NSDate 对象?

如何创建过去的新 NSDate 对象,例如比另一个日期早 1 秒?

如何使 NSDate 与关联对象一起工作?