优化嵌套的for循环

时间:2011-07-06 11:11:56

标签: objective-c loops

所以,我有以下循环,它有点瓶颈 - 有什么方法可以加快速度吗?

NSArray *array = [an array of NSDictionaries];
NSArray *otherArray = [an array of NSStrings];
NSMutableArray *newArray = [NSMutableArray new] autorelease];

for (NSDictionary *dict in array)
{
    NSString *name = [[NSString alloc] initWithString:[dict objectForKey@"name"]];
    for (NSString *n in otherArray)
    {
        if ([name hasPrefix:n])
            [newArray addObject:dict];
    }
    [name release];
}

3 个答案:

答案 0 :(得分:0)

您可以定义NSPredicate并使用

- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate

array上,不要自行循环。如果它实际上更快,你需要分析。

答案 1 :(得分:0)

您可以使用谓词来过滤array&完全删除循环。

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(%@, $str, name BEGINSWITH[cd] $str).@count != 0", otherArray];
NSArray * newArray = [array filteredArrayUsingPredicate:predicate];

假设name是关键。

答案 2 :(得分:0)

关于我可以看到的实质性收益的所有内容是你可以组成一个由你的前缀的第一个字母索引的布尔C风格的数组,并根据该字符是否是“命中”以YES / NO预先加载它。 (可能你想要一个256字节的数组,由2字节字符的低字节索引。)在外部循环中取名字的第一个字符,索引这个数组,如果它是NO,那么跳过其余的外部循环体。仅在前缀数组相当小的情况下才有效(因此少于约一半的布尔数组元素为YES)。

你可以通过使用C风格的数组而不是前缀NSArray来进行一些小的改进,但代价是预先创建那个C风格的数组。

还有其他技术会涉及散列,但设置费用和复杂性可能不值得。