我一直试图找出一种方法来检查NSArray
中某个对象的数量。
我查看了文档,我很确定没有预制的方法。此外,我在SO上找不到任何东西。
有人知道这样做的好方法吗?因为我真的不能想出任何东西。
在这个特定的情况下,我有一个带字符串的数组(大多数情况下是几个),我想计算数组中有多少字符串与我要求的匹配。
答案 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的块。然后你可以用它来比较你想要的任何数组。