【问题标题】:conditional nsarray count条件 nsarray 计数
【发布时间】:2012-04-26 16:30:45
【问题描述】:

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

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

【问题讨论】:

  • 什么不起作用?您期望什么结果,您的输入数据是什么?
  • count 没有出现在代码自动完成中,并且显示错误“Bad receiver type 'void'”

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


【解决方案1】:

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

使用 NSArray 的 indexesOfObjectsPassingTest: 并获取结果 NSIndexSetcount

Documented here.

【讨论】:

  • indexOfObjectPassingTest 表示它返回第一个匹配项。
  • @Darren - 答案中的错字,indexES... 代替。
  • 对。有一个复数方法:indexesOfObjectsPassingTest。它返回一个 NSIndexSet.
  • 感谢您修正错别字。所以在第一杯咖啡之前充满了愚蠢。
  • 谢谢,我最终发现了 2 个不同的 indexOfObject/indexesOfObjects。我现在有了这个,但它返回实际结果的-1! NSLog(@"HERE: %d",[[_sections indexOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { if ([[obj objectAtIndex:4] isEqualToString:@"1"]) { return TRUE; } else { return FALSE; } }] count]);
【解决方案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 的答案是否被接受——但我也是块函数的新手,并且很欣赏这个谜题。)

【讨论】:

  • 细化;在块外使用__block NSUInteger count = 0;,并在通过测试时在内部增加。比创建数组更有效。是否比创建 NSIndexSet 更高效只能通过测试来解决(__block 有开销,NSIndexSet 很便宜)。
  • +1 这正是 Stack Overflow 允许除了接受的答案之外的多个答案的原因。
【解决方案3】:

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;
}

还要注意,我在NSLog 中使用了正确的%lu 格式和(unsigned long) 类型。 %d 不是描述性的,doesn't act the same in all scenarios

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多