在NSArray中计算相等的对象

时间:2012-09-14 14:53:08

标签: objective-c foundation

我一直试图找出一种方法来检查NSArray中某个对象的数量。

我查看了文档,我很确定没有预制的方法。此外,我在SO上找不到任何东西。

有人知道这样做的好方法吗?因为我真的不能想出任何东西。

在这个特定的情况下,我有一个带字符串的数组(大多数情况下是几个),我想计算数组中有多少字符串与我要求的匹配。

7 个答案:

答案 0 :(得分:13)

如果这是数据结构的主要用途并且顺序无关紧要,请考虑切换到专门用于有效解决此问题的NSCountedSet

如果您需要有序集合,并且没有大量对象,则快速枚举答案是最佳方法。

如果您想知道对象的位置,请使用indexesOfObjectsPassingTest:

如果您有大量对象,我会使用indexesOfObjectsWithOptions:passingTest:选项查看NSEnumerationConcurrent。这将允许您在多个核心上搜索阵列。 (这在多核设备上可能更快,即使这样,如果你有一个非常大的集合,可能只会更快。你应该在假设并发会更快之前绝对测试。)即使你只需要最终计数, 可能更快某些数据集使用此方法,然后在最终索引集上使用count

答案 1 :(得分:8)

实际上有一种方法:- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate

NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger index, BOOL *stop) {
    return [obj isEqualTo:myOtherObject];
}];

答案 2 :(得分:5)

听起来像是NSCountedSet的情况,它使用initWithArray:初始化程序完成了您的工作:

// Example array of strings
NSArray *array = [NSArray arrayWithObjects:
                  @"Joe", @"Jane", @"Peter", @"Paul",
                  @"Joe", @"Peter", @"Paul",
                  @"Joe",
                  @"Jane", @"Peter",
                  nil];

NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray: array];

// for-in will let you loop over the counted set
for (NSString *str in countedSet) {
    NSLog(@"Count of %@: %ld", str, (long)[countedSet countForObject:str]);
}

答案 3 :(得分:1)

一种方法是迭代和检查。

- (int)repeatsOf:(NSString *)repeater inArray:(NSArray *)array {
    int count = 0;

    for (NSString *item in array) {
        if ([item isEqualToString:repeater]) {
            count++;
        }
    }

    return count;
}

答案 4 :(得分:1)

你可以尝试一个简单的循环。假设needle是您的引用字符串,array是您的NSArray字符串:

unsigned int n = 0;

for (NSString * str in array)
{
    if ([needle isEqualToString:str])
    {
        ++n;
    }
}

现在n保持字符串数等于needle

答案 5 :(得分:1)

你可以定义一个这样的函数:

- (int)countStringsThatMatch:(NSString*)match inArray:(NSArray*)array
{
    int matches = 0;

    for (id string in array) {
        if ([string isEqualToString:match]) {
            matches++;
        }
    }

    return matches;    
}

然后使用它:

int count = [self countStringsThatMatch:@"someString" inArray:someArray];

答案 6 :(得分:1)

- (NSUInteger) objectCountInArray:(NSArray *)array 
                   matchingString:(NSString *)stringToMatch {
    NSUInteger count = 0;
    for (NSString *string in array) {
        count += [string isEqualToString:stringToMatch] ? 1 : 0;
    }

    return count;
}

您可以尝试展开它以使用获取对象并返回BOOL的块。然后你可以用它来比较你想要的任何数组。