目标C:在Array的对象之间进行条件检查的最快方法

时间:2013-06-18 13:44:53

标签: objective-c arrays comparison

我有NSArray个自定义对象。这些对象具有属性price,我想将其与数组中所有其他对象的price进行比较。如果与另一个对象价格的价格差异小于100,则应该进行方法调用。

NSArray products (
  {
      name = "Product A";
      price = "1299.50";
  },
  {
      name = "Product B";
      price = "999.90";
  },
  {
      name = "Product C";
      price = "1249.00";
  },
  {
      name = "Product D";
      price = "1899.50";
  }
)

=>产品A和产品C的价格差异为<因此,应该调用方法closePrices:(NSArray *)objectsWhichAreClose来传递接近的对象。

我想知道哪种方法最有效?

2 个答案:

答案 0 :(得分:1)

for (int i=0;i<[products count];i++){
  for (int j=0;j<[products count];j++){
  if (i != j){
  MyClass *obj = (MyClass*)[products objectAtIndex:i];
  MyClass *obj2 = (MyClass*)[products objectAtIndex:j];

  if (fabs(obj.price - obj2.price) < 100){
     [self closePrices];
   }
 }

}
}

注意:别忘了在fabs()

中包含数学

答案 1 :(得分:1)

简单快速的解决方案是按顺序排序然后搜索。

可以在O(N logN)中实现排序。您可以将数组中的每个项目与后面的项目进行比较。如果差异小于100,请执行所需的方法。

如果您需要检测所有近距离物体,您可以继续迭代,直到找到具有差异的对象&gt; 100。

for(int i = 0; i < sortedProducts.count; i++) {
    for(int j = i + 1; j < sortedProducts.count; j++) {
        if(sortedProjects[j].price - sortedProjects[i].price <= 100) {
            [self callMethod];
        }
        else {
            break;
        }
    }
}

此循环实际上具有O(N ^ 2)的运行时间。但是,根据数据的性质,它可以实现更好的时间。如果关闭数字对是所有可能对的小子集,则会发生这种情况。如果不是这种情况,即许多物体彼此接近,那么我建议你实施@ DrDev的解决方案。在这种情况下,它更简单。