条件nsarray计数

时间:2012-04-14 17:08:13

标签: objective-c xcode cocoa-touch nsmutablearray nsarray

我想要计算子数组满足条件的数组。 我以为我能做到这一点,但我做不到。

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

3 个答案:

答案 0 :(得分:8)

enumerateObjectsUsingBlock:不会返回任何内容。我敢打赌代码甚至不会编译(并且,正如你的评论所说,自动完成不起作用 - 它不应该)。

使用NSArray的indexesOfObjectsPassingTest: 并获取生成的count的{​​{1}}。

Documented here.

答案 1 :(得分:2)

bbum是对的;你应该使用indicesOfObjectsPassingTest。它更直接。

但你可以使用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