我有一个对象数组,每个对象都有一个日期。 我想在每个具有相同日期的对象上对另一个数组进行分组。 我的想法是:按对象的日期对数组进行排序,对于数组上的每个对象,执行以下操作:如果索引i处的对象在索引i + 1处具有相同的对象日期,则将索引i处的对象添加到临时数组;否则将索引i处的对象添加到临时数组,将数组添加到输出数组并从临时数组中删除所有对象。
我的代码是:
- (void) group{
NSMutableArray *aux = [[NSMutableArray alloc] init];
MyObject *currentObject;
MyObject *nextObject;
// Sort array
NSArray *sortedArray;
sortedArray = [_storeManager.activities sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(MyObject *)a date];
NSDate *second = [(MyObject *)b date];
return [first compare:second];
}];
// Grouping array
if ([sortedArray count] > 0) {
for (int i = 0; i < [sortedArray count] -1 ; i++) {
currentObject = sortedArray[i];
nextObject = sortedArray[i+1];
int currentDayObject = [currentObject getDayOfDate];
int currentMonthObject = [currentObject getMonthOfDate];
int currentYearObject = [currentObject getYearOfDate];
int nextDayObject = [nextObject getDayOfDate];
int nextMonthObject = [nextObject getMonthOfDate];
int nextYearObject = [nextObject getYearOfDate];
if ((currentDayObject == nextDayObject) && (currentMonthObject == nextMonthObject) && (currentYearObject == nextYearObject)) {
[aux addObject:currentObject];
} else {
[aux addObject:currentObject];
[_grouped addObject:aux];
[aux removeAllObjects];
}
}
[_grouped addObject:aux];
}
为什么我NSLog(@"items on grouped %d",[_grouped count]);
总是返回0?
答案 0 :(得分:0)
您可以使用带有键路径的过滤器数组来执行此操作,它会为您提供具有不同日期的所有对象:
NSArray *distinct = [_storeManager.activities valueForKeyPath:@"@distinctUnionOfObjects.date"]
现在你必须创建循环以枚举所有对象并使用谓词对日期进行过滤:
for(NSString *dateAsString in distinct)
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date == %@)", dateAsString];
NSArray *arrayForTheSameDay = [_storeManager.activities filteredArrayUsingPredicate: predicate];
}
您只需修改此代码即可匹配您的属性。
<强>扩展强>
如果您想忽略创建开始日期和结束日期所需的时间并将谓词更改为:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];
要从具有特定格式的字符串创建NSDate,您可以使用NSDateFormatter
,有很多示例如何执行此操作。
答案 1 :(得分:0)
建议:使用NSMutableDictionary
,将日期作为键,NSMutableArray
作为值。
您不必对初始数组进行排序。只需浏览它,对于您遇到的每个日期,查看该日期的密钥是否已经在字典中。如果没有,请创建一个数组并将其添加到字典中,并将日期作为键。如果找到了日期,请获取与该键对应的数组并将新对象添加到该数组中。
最后,你应该有一个NSMutableDictionary
,其中所有日期都是关键字,所有相应的对象都是这些关键字的值。将其视为频率分析。
关于你的分组计数为零的问题,对不起,我没有按照代码。