我想对子数组满足条件的数组进行计数。我以为我可以做到这一点,但我做不到。
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
我想对子数组满足条件的数组进行计数。我以为我可以做到这一点,但我做不到。
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
enumerateObjectsUsingBlock:
不返回任何东西。我敢打赌,代码甚至不会编译(而且,正如您的评论所述,自动完成不起作用——它不应该)。
使用 NSArrayindexesOfObjectsPassingTest:
并获取count
结果的NSIndexSet
.
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 的答案作为接受的答案——但我也是块函数的新手,并且很欣赏这个谜题。)
使用 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
不是描述性的,并且在所有情况下都不相同。