在多维数组中搜索NSObject

时间:2015-03-11 17:43:21

标签: objective-c

在我的tableview中,我有一个包含类别的数组,每个类别中都有多个产品(所有这些产品都是NSObjects):

category-1:
  - product-1
  - product-3
category-2:
  - product-2
  - ...

单击按钮时,会选择随机产品。我需要在数组中找到具有类别和产品的匹配产品。没有太多循环,任何提示都会这样做吗?

这是数据结构的构建方式:

for(Category *category in self.categories){
    NSMutableArray *categorydata = [[NSMutableArray alloc] init];
    for(Product *product in self.products){
        if(category.catid == product.catid) [categorydata addObject:product];
    }
    [[AppModel sharedInstance].serverDocuments addObject:categorydata];
}

类别和产品是带有catid和名称的自定义NSObject。

2 个答案:

答案 0 :(得分:0)

首先,这段代码很愚蠢:

for(Category *category in self.categories){
    NSMutableArray *categorydata = [[NSMutableArray alloc] init];
    for(Product *product in self.products){
        if(category.catid == product.catid) [categorydata addObject:product];
    }
    [[AppModel sharedInstance].serverDocuments addObject:categorydata];
}

如果只有一个产品category.catid == product.catid,那么在您的if子句中,您应该break找到它之后:没有必要继续循环,因为搜索是有效的结束了。

第二,当然,您可以通过使用NSPredicate和/或键值编码等技术更紧凑地表达。但在引擎盖下,循环仍然会发生,所以没有真正获得的东西。问题是你没有把它结构化为一个字典,其中有一个键将直接带到正确的条目。如果您想要这种直接访问,则必须重新构建模型。

答案 1 :(得分:0)

目前,您的代码将遍历每个类别的每个产品。 一旦找到了您正在寻找的产品,就应该先使用break。这将“打破”产品循环。

然后您还应该break退出类别循环(请参阅https://stackoverflow.com/a/9419013/4633161)或 - 如果您需要循环播放后续类别continue