我有一个充满字典的NSArray。
我想遍历它,并找到所有键值与单独数组中存在的任何字符串对象匹配的字典。
然后,我想将其添加到找到的所有对象的新结果数组中。
我现在就是这样做的,但是我想知道是否有更有效,更快的方法。
NSArray *arrayOfDictionaries, *arrayOfIDs;
NSMutableArray *results = [NSMutableArray array];
for (NSDictionary *dict in arrayOfDictionaries) {
for (NSString *userID in arrayOfIDs) {
if ([userID isEqualToString:dict[@"user_id"]]) {
[results addObject:dict];
}
}
}
return results;
是的,通过使用以下NSArray containsObject:
方法,您的代码可能会更简单:
NSArray *arrayOfDictionaries, *arrayOfIDs;
NSMutableArray *results = [NSMutableArray array];
for (NSDictionary *dict in arrayOfDictionaries) {
if ([arrayOfIDs containsObject:dict[@"user_id"]) {
[results addObject:dict];
}
}
return results;
请注意,尽管这段代码更易于阅读和理解,但它的运行时复杂度仍然与原始方法类似。
这是因为尽管您发布的代码N^2
在中间具有显式的运行时复杂性(嵌套的for循环),而我的新版本显然仅具有N
复杂性,但containsObject:
调用包含一个循环,因此仍然存在N^2
复杂性。
如果您希望算法更有效-仅在这很重要的情况下,请不要过早优化!-您可以使用NSSet
而不是NSArray
来存储usersIDs
。这将更快,因为NSArray
查找是线性时间,而NSSet
使用哈希进行查找,并且比线性运行时查找要好。
请注意,如果要将自己的自定义对象放入中NSSet
,则应在该对象上覆盖isEquals:
和hashcode
。有关更多信息,请参见覆盖isEqual:和哈希的最佳做法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句