我一直在试图找出一种方法来检查某个对象中有多少NSArray
.
我浏览了文档,我很确定没有预制的方法。我也在这里找不到任何东西。
有人知道这样做的好方法吗?因为我真的什么都想不出来。
在这种特定情况下,我有一个带有字符串的数组(大多数情况下每个都有几个),我想计算数组中有多少字符串与我要求的匹配。
我一直在试图找出一种方法来检查某个对象中有多少NSArray
.
我浏览了文档,我很确定没有预制的方法。我也在这里找不到任何东西。
有人知道这样做的好方法吗?因为我真的什么都想不出来。
在这种特定情况下,我有一个带有字符串的数组(大多数情况下每个都有几个),我想计算数组中有多少字符串与我要求的匹配。
如果这是数据结构的主要用途并且顺序无关紧要,请考虑切换到NSCountedSet
专门用于有效解决此问题的。
如果您需要一个有序集合,并且您没有大量对象,那么快速枚举答案是最好的方法。
如果您想知道对象在哪里,请使用indexesOfObjectsPassingTest:
.
如果您有大量对象,我会选择indexesOfObjectsWithOptions:passingTest:
该NSEnumerationConcurrent
选项。这将允许您在多个内核上搜索阵列。(这在多核设备上可能更快,即使这样也可能只有在你有一个非常大的集合时才会更快。在假设并发会更快之前,你应该绝对测试。)即使你只需要最终计数,某些数据集使用此方法然后在最终索引集上使用可能会更快。count
实际上有一个方法:- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger index, BOOL *stop) {
return [obj isEqualTo:myOtherObject];
}];
听起来像 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]);
}
一种方法是迭代和检查。
- (int)repeatsOf:(NSString *)repeater inArray:(NSArray *)array {
int count = 0;
for (NSString *item in array) {
if ([item isEqualToString:repeater]) {
count++;
}
}
return count;
}
你可以尝试一个简单的循环。假设needle
是您的参考字符串,并且array
是您的 NSArray 字符串:
unsigned int n = 0;
for (NSString * str in array)
{
if ([needle isEqualToString:str])
{
++n;
}
}
现在n
保持字符串的数量等于needle
。
你可以定义一个这样的函数:
- (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];
- (NSUInteger) objectCountInArray:(NSArray *)array
matchingString:(NSString *)stringToMatch {
NSUInteger count = 0;
for (NSString *string in array) {
count += [string isEqualToString:stringToMatch] ? 1 : 0;
}
return count;
}
您可以尝试扩展它以使用获取对象并返回 BOOL 的块。然后你可以用它来比较你想要的任何东西的数组。