Objective c 对NSArray中的相等对象计数

Objective c 对NSArray中的相等对象计数,objective-c,foundation,Objective C,Foundation,我一直在试图找出一种方法来检查某个对象在NSArray中的数量 我已经看过了文档,我很确定没有预先制作的方法。我在这里也找不到任何东西 有人知道这样做的好方法吗?因为我真的什么都想不出来 在这种情况下,我有一个带有字符串的数组(大多数情况下每个都有几个字符串),我想计算数组中有多少字符串与我要求的匹配。一种方法是迭代和检查 - (int)repeatsOf:(NSString *)repeater inArray:(NSArray *)array { int count = 0;

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

我已经看过了文档,我很确定没有预先制作的方法。我在这里也找不到任何东西

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


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

一种方法是迭代和检查

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

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

    return count;
}

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

unsigned int n = 0;

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

现在
n
将字符串的计数保持为等于
pinder

您可以定义如下函数:

- (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];

您可以尝试将其展开,以使用获取对象并返回BOOL的块。然后您可以使用它来比较任意数组。

实际上有一个方法:
-(NSIndexSet*)indexesOfObjectsPassingTest:(BOOL(^)(id obj,nsuiger idx,BOOL*stop))谓词

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

听起来像是
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]);
}

如果这是数据结构和顺序的一个主要用途,那就考虑切换到<代码> NSCONTEDSETP>/代码>,这是专门用于有效地解决这个问题的。p> 如果您需要一个有序的集合,并且没有庞大的对象集,那么快速枚举答案是最好的方法

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


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

你不知道我自己没有想到这一点会有什么感觉…^^我试试看,你就拿到支票了!我们都会时不时地被简单的事情缠住,别担心!这真是太棒了。我不知道这个哦,伙计,我在寻找那个方法,但我只能在NSSet中找到它。不知道为什么!真的很好,很有教育意义!但是我已经查过其他人了。。。为它的努力和伟大而投票吧@用户1534948您不应该检查第一个答案,而是检查给出最正确答案的答案(依我拙见,就是这个答案)。检查一个更新的、更完整的答案并没有什么错。这一点很好。基本上是值得怀疑的,因为在这篇文章发布之前,我已经用过另一篇了。虽然我想这会帮助更多未来的搜索者。是的,这绝对应该是公认的答案。我敢打赌,很多已经使用ios一段时间的人(比如我自己)也不知道这一点!
// 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]);
}