3

我一直在试图找出一种方法来检查某个对象中有多少NSArray.

我浏览了文档,我很确定没有预制的方法。我也在这里找不到任何东西。

有人知道这样做的好方法吗?因为我真的什么都想不出来。

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

4

7 回答 7

13

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

如果您需要一个有序集合,并且您没有大量对象,那么快速枚举答案是最好的方法。

如果您想知道对象在哪里,请使用indexesOfObjectsPassingTest:.

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

于 2012-09-14T15:07:32.670 回答
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];
}];
于 2012-09-14T15:06:59.757 回答
5

听起来像 for 的一个案例,它使用它的初始化器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]);
}
于 2012-09-14T15:07:20.713 回答
1

一种方法是迭代和检查。

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

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

    return count;
}
于 2012-09-14T14:58:04.830 回答
1

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

unsigned int n = 0;

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

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

于 2012-09-14T14:58:09.753 回答
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];
于 2012-09-14T14:58:22.270 回答
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 的块。然后你可以用它来比较你想要的任何东西的数组。

于 2012-09-14T15:04:09.007 回答