2

我想对子数组满足条件的数组进行计数。我以为我可以做到这一点,但我做不到。

NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            [[obj objectAtIndex:4] isEqualToString:@"1"];
        }] count]);
4

3 回答 3

8

enumerateObjectsUsingBlock:不返回任何东西。我敢打赌,代码甚至不会编译(而且,正如您的评论所述,自动完成不起作用——它不应该)。

使用 NSArrayindexesOfObjectsPassingTest: 并获取count结果的NSIndexSet.

记录在这里。

于 2012-04-14T17:32:32.720 回答
2

bbum 是对的;您应该使用 indexOfObjectsPassingTest。它更简单。

但是你可以用来enumerateObjectsUsingBlock计算测试通过者,像这样:

NSArray *sections = [NSArray arrayWithObjects:@"arb", @"1", @"misc", @"1", @"extra", nil];
NSMutableArray *occurrencesOf1 = [NSMutableArray array];
[sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([(NSString*)obj isEqualToString:@"1"])
        [occurrencesOf1 addObject:obj];
}];
NSLog(@"%d", [occurrencesOf1 count]); // prints 2

它效率低下,因为它需要额外的可变数组。

(所以你应该检查 bbum 的答案作为接受的答案——但我也是块函数的新手,并且很欣赏这个谜题。)

于 2012-04-14T17:46:25.203 回答
0

使用 for 循环更快(而且,IMO,更具可读性):

    NSLog(@"%lu", (unsigned long)[self countSectionsWithValue:@"1" atIndex:4]);
    // ...
}

// ...

- (NSUInteger) countSectionsWithValue:(NSString *)value atIndex:(NSInteger)idx
{
    NSUInteger count = 0
    for (id section in _sections)
    {
        if ([[section objectAtIndex:idx] isEqualToString:value])
        {
            count++;
        }
    }
    return count;
}

另请注意,我使用了正确的%lu格式并(unsigned long)NSLog. %d不是描述性的,并且在所有情况下都不相同

于 2016-03-07T22:45:05.653 回答