【问题标题】:How can I speed up my array search with an NSPredicate?如何使用 NSPredicate 加快数组搜索速度?
【发布时间】:2012-04-24 09:42:27
【问题描述】:

我有一个类别数组和另一个类别 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;
}

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

【问题讨论】:

    标签: objective-c nspredicate


    【解决方案1】:
    return [categories filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"categoryID IN %@", categoryIDs]];
    

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

    您可以通过从categoryIDs 创建一个NSSet 并使用-containsObject: 来改进您的代码,而不是循环遍历categoryIDs 并手动调用-isEqual:

    【讨论】:

      【解决方案2】:

      我不确定谓词,但立即优化是将您的类别 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]];
      }
      

      如果categoriescategoryIDs 较大,这仍将比您原来的方法高效得多。

      【讨论】:

      • 谢谢 - 虽然这改变了方法的签名,所以它对我们不适用。
      • @Simon:这是一种新方法,因此不会更改签名。不过,我会稍微修改一下答案以提供帮助。
      【解决方案3】:
      NSPredicate* searchPredicate = [NSPredicate predicateWithFormat:@"categoryID == %f", categoryID];
          NSArray *categoriesWithIDs =[categories filteredArrayUsingPredicate:searchPredicate];
          return categoriesWithIDs;
      

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

      【讨论】:

        猜你喜欢
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多