Objective-C:计算对象在数组中出现的次数?

Emp*_*ump 13 arrays objective-c count

我需要执行我认为的基本功能,但我找不到任何关于如何操作的文档.请帮忙!

我需要计算某个对象在数组中出现的次数.见例子:

array = NSArray arrayWithObjects:@"Apple", @"Banana", @"Cantaloupe", @"Apple", @"DragonFruit", @"Eggplant", @"Apple", @"Apple", @"Guava",nil]retain];
Run Code Online (Sandbox Code Playgroud)

如何迭代数组并计算它找到字符串@"Apple"的次数?

任何帮助表示赞赏!

Mar*_*aev 19

还有一个解决方案,使用块(工作示例):

NSInteger occurrences = [[array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {return [obj isEqual:@"Apple"];}] count];
NSLog(@"%d",occurrences);
Run Code Online (Sandbox Code Playgroud)


zap*_*aph 17

正如@bbum所说,使用NSCounted集.有一个初始化器,它会将一个数组直接转换为一个计数集:

    NSArray *array = [[NSArray alloc] initWithObjects:@"A", @"B", @"X", @"B", @"C", @"D", @"B", @"E", @"M", @"X", nil];
    NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:array];
    NSLog(@"%@", countedSet);
Run Code Online (Sandbox Code Playgroud)

NSLog输出:(D [1],M [1],E [1],A [1],B [3],X [2],C [1])

只需访问项目:

count = [countedSet countForObject: anObj]; ...
Run Code Online (Sandbox Code Playgroud)


nac*_*o4d 15

一个简单而具体的答案:

int occurrences = 0;
for(NSString *string in array){
    occurrences += ([string isEqualToString:@"Apple"]?1:0); //certain object is @"Apple"
}
NSLog(@"number of occurences %d", occurrences);
Run Code Online (Sandbox Code Playgroud)

PS:Martin Babacaev的答案也很好.块的迭代速度更快,但在这种特殊情况下,元素很少,我猜没有明显的增益.我会用那个虽然:)

  • 为什么不只是`occurrence + + [字符串isEqualToString:@"Apple"];`? (2认同)

bbu*_*bum 15

用一个NSCountedSet; 它比字典更快,旨在解决这个问题.

NSCountedSet *cs = [NSCountedSet new];
for(id anObj in someArray) 
    [cs addObject: anObj];

// then, you can access counts like this:
.... count = [cs countForObject: anObj]; ...

[cs release];
Run Code Online (Sandbox Code Playgroud)


til*_*ilo 7

刚刚遇到这个相当古老的问题.我建议使用NSCountedSet:

NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:array];
NSLog(@"Occurrences of Apple: %u", [countedSet countForObject:@"Apple"]);
Run Code Online (Sandbox Code Playgroud)