0

我有一个类别数组和另一个类别 ID 数组。我想提取具有匹配 ID 的类别。目前,我的代码看起来有点像这样:

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDs:(NSArray *)categoryIDs {
    NSMutableArray *categoriesWithIDs = [NSMutableArray array];

    for (SGBCategory *category in categories) {
        for (NSNumber *categoryID in categoryIDs) {
            if ([category.categoryID isEqual:categoryID]) {
                [categoriesWithIDs addObject:category];
                break;
            }
        }
    }

    return categoriesWithIDs;
}

嗯,我知道。所以我想做的是类似于SELECT * FROM categories WHERE categories.categoryID in (categoryIDs)SQL 中的操作。我认为 NSPredicate 是表达这类事情的客观 c 方式,但我不知道如何让它做我想做的事。如何使用 NSPredicate 加快数组搜索速度?

4

3 回答 3

2
return [categories filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"categoryID IN %@", categoryIDs]];

不过,我不知道它会更快。它基本上必须和你的代码做同样的事情,外加一个谓词。

您可以通过创建NSSetfrom thecategoryIDs和 using来改进您的代码,而不是手动-containsObject:循环categoryIDs和调用。-isEqual:

于 2012-04-24T10:03:30.093 回答
1

我不确定谓词,但立即优化是将您的类别 ID 放在一个集合中

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDsFromSet:(NSSet *)categoryIDs {
    NSMutableArray *categoriesWithIDs = [NSMutableArray array];

    for (SGBCategory *category in categories) {
        if ([categoryIDS containsObject: [category categoryID]])
        {
            [categoriesWithIDs addObject:category];
        }
    }
    return categoriesWithIDs;
}

编辑

如果您想继续使用旧方法,请修改它:

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDs:(NSArray *)categoryIDs {

    return [self categoriesFromArray: categories withIDsFromSet: [NSSet setWithArray: categoryIDs]];
}

这仍然比您提供的原始方法更有效,categories或者更大categoryIDs

于 2012-04-24T10:24:56.153 回答
0
NSPredicate* searchPredicate = [NSPredicate predicateWithFormat:@"categoryID == %f", categoryID];
    NSArray *categoriesWithIDs =[categories filteredArrayUsingPredicate:searchPredicate];
    return categoriesWithIDs;

这就是你将如何做你想做的事。假设类别 id 是浮点数。根据需要更改 %f,就像使用 NSLog 一样。

于 2013-04-14T09:51:42.740 回答