将数组的元素放在另一个数组上

时间:2014-01-24 16:29:31

标签: objective-c nsmutablearray

我有一个对象数组,每个对象都有一个日期。 我想在每个具有相同日期的对象上对另一个数组进行分组。 我的想法是:按对象的日期对数组进行排序,对于数组上的每个对象,执行以下操作:如果索引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?

2 个答案:

答案 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,其中所有日期都是关键字,所有相应的对象都是这些关键字的值。将其视为频率分析。

关于你的分组计数为零的问题,对不起,我没有按照代码。