如何按日期对 NSMutableArray 进行分组

Posted

技术标签:

【中文标题】如何按日期对 NSMutableArray 进行分组【英文标题】:How to group NSMutableArray by Date 【发布时间】:2013-09-15 15:00:40 【问题描述】:

我有一个名为 records 的 NSMutableArray,其中包含一些单条记录。所以结构是这样的:

记录 记录(“名称”:“test1”,“时间戳”:“2013-09-15 12:34:35 +0000”) 记录(“名称”:“test2”,“时间戳”:“2013-09-14 11:21:42 +0000”) 记录(“名称”:“test3”,“时间戳”:“2013-09-14 10:47:42 +0000”) 记录(“名称”:“test4”,“时间戳”:“2013-09-12 17:11:42 +0000”) 记录(“名称”:“test5”,“时间戳”:“2013-09-12 19:52:42 +0000”)

知道我想在 UITableView 中显示它们。没有部分也可以正常工作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    [...]

    NSManagedObject *record = [self.records objectAtIndex:indexPath.row];

    cell.recordNameLabel.text = [record valueForKey:@"name"];
    return cell;

但现在我想用时间戳值将记录分开。所以我的想法是创建一个名为 sorted Records 的新 NSMutableArray,结构如下:

记录

日(2013-09-15)

记录(“名称”:“test1”,“时间戳”:“2013-09-15 12:34:35 +0000”)

日(2013-09-14)

记录(“名称”:“test2”,“时间戳”:“2013-09-14 11:21:42 +0000”) 记录(“名称”:“test3”,“时间戳”:“2013-09-14 10:47:42 +0000”)

日(2013-09-12)

记录(“名称”:“test4”,“时间戳”:“2013-09-12 17:11:42 +0000”) 记录(“名称”:“test5”,“时间戳”:“2013-09-12 19:52:42 +0000”)

如何将记录分组/分离到我的排序结构?

感谢您的帮助。

【问题讨论】:

你的时间戳是字符串还是 NSDate 对象? 【参考方案1】:

一种可能的解决方案是:

1) 使用一种方法创建 NSDate 类别,例如 day:

@interface NSDate(Day)
- (NSDate*) day;
@end
@implementation NSDate(Day)
- (NSDate*) day

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:self];
    return [[NSCalendar currentCalendar] dateFromComponents:comps];

@end

2) 使用 NSFetchedResultsController 和 sectionNameKeyPath - @"timestamp.day"

【讨论】:

+1,尽管我强烈建议您使用comps.hour = 12;。这样生成的NSDate 将在中午,而不是午夜。午夜有一些奇怪的事情(不是每天都有午夜),可能会导致微妙的错误结果。 戴夫,你能解释一下哪一天没有午夜吗?我以前从未见过这样的案例。 在巴西,夏令时跳跃发生在午夜,所以在那些日子(当他们失去一个小时),没有午夜。时间直接从晚上 11:59:59 到凌晨 1:00:00。另请参阅this question。【参考方案2】:

如果“Records”是字典对象的 NSMutableArray,字段“timestamp”为 NSDate 类型,则可以使用 NSSortDescriptor

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:FALSE];
[allVideos sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

*它是一个降序数组。 ascending:TRUE 表示数组升序!!!

【讨论】:

以上是关于如何按日期对 NSMutableArray 进行分组的主要内容,如果未能解决你的问题,请参考以下文章

使用关系对 NSMutableArray 进行排序

如何按升序对 NSMutablearray 进行排序

如何按数值对包含 NSDictionary 的 NSMutableArray 进行排序?

如何按NSString长度对NSMutableArray进行排序?

如何对数组中的日期进行分组?

按字母顺序对 NSMutableArray 进行排序[重复]