我有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
来传递接近的对象。
我想知道哪种方法最有效?
答案 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的解决方案。在这种情况下,它更简单。