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