0

我有一个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 的价格差异小于 100,因此closePrices:(NSArray *)objectsWhichAreClose应该调用一个方法来传递接近的对象。

我想知道实现这一目标的最有效方法是什么?

4

2 回答 2

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() 的数学

于 2013-06-18T14:04:59.377 回答
1

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

排序可以在 O(N logN) 中完成。您可以将数组中的每一项与它后面的一项进行比较。如果差值小于 100,则执行所需的方法。

如果您需要检测所有靠近的物体,您可以不断迭代,直到找到差异 > 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 的解决方案。在这种情况下更简单。

于 2013-06-18T14:31:30.883 回答