我想要计算子数组满足条件的数组。 我以为我能做到这一点,但我做不到。
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
答案 0 :(得分:8)
enumerateObjectsUsingBlock:
不会返回任何内容。我敢打赌代码甚至不会编译(并且,正如你的评论所说,自动完成不起作用 - 它不应该)。
使用NSArray的indexesOfObjectsPassingTest:
并获取生成的count
的{{1}}。
答案 1 :(得分:2)
但你可以使用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的答案视为已接受的答案 - 但我也是块功能的新手,并且对这个难题表示赞赏。)
答案 2 :(得分:0)
It's faster to use a for loop(以及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
不具有描述性,doesn't act the same in all scenarios。