2012-02-27 64 views
0

我有一个Car类。它有一个名为enginePower的属性。另一方面,我有一个包含超过50个汽车物体的NSArray。我将如何选择具有最高enginePower的汽车,同时它还低于给定值。当我问的车是低于320就应该给我的525i宝马最高enginePowerObjective-C-获取具有最大属性值的对象

BMW X5-345 hp 
Audi A3-200 hp 
BMW 525i -225 hp 
VW Passat CC-175 hp 
..... 

现在,从这个数组汽车:更清晰。是否有可能实现。我的意思是说有一个很好很简单的方法,还是需要很多代码?

+2

看['NSPredicate'](https://developer.apple.com/library/mac /搜索/ q = nspredicate)。 – 2012-02-27 19:55:17

回答

4

由@Jasarien提供的答案会工作得很好,但如果你想避免代码写来遍历你可以尝试这样的:

- (Car *)getHighestPowerFromCars:(NSArray *)carArray atLeast:(NSNumber *)minPower { 
    NSArray *descriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"enginePower" ascending:NO]]; 
    NSArray *sortedArray = [carArray sortedArrayUsingDescriptors:descriptors]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"enginePower >= %@", minPower]; 
    NSArray *filteredArray = [sortedArray filteredArrayUsingPredicate:predicate]; 
    return [filteredArray objectAtIndex:0]; 
} 
+0

更好的解决方案:P – Jasarien 2012-02-28 07:53:44

1

使用引擎功率属性对数组进行排序,然后遍历数组,直到找到大于指定值的enginePower值。然后取currentArrayIndex - 1中的对象的值。

您可以通过在NSArray(这将返回一个新的,排序,自动释放阵列)上NSMutableArray-sortedArrayUsingSelector:使用-compareUsingSelector:做到这一点。

您可以在您的Car类中创建一个名为类似-compareUsingEnginePower:的类,该类将以另一个Car对象作为参数。

然后您可以比较两个enginePower属性并返回NSOrderedSame,NSOrderedAscendingNSOrderedDescending之一。

+0

似乎它会按电源顺序对所有车辆进行排序,但OP想要从功率低于标称值的车辆子集中选择一辆车。 – 2012-02-27 19:49:28

+0

哦,我错过了那一点...:/ – Jasarien 2012-02-27 19:50:15

+0

固定...从现在开始我会更仔细地阅读问题。 – Jasarien 2012-02-27 19:56:09

-1

直白迭代通过数组,仅在汽车寻找下面的功率限制,并挑选具有最高功率:

— (Car *)getHighestPowerFromCars:(NSArray *)carArray lessThan:(NSNumber *)maxPower 
{ 
    NSNumber* highest = nil; 
    Car* highestCar = nil; 

    for (Car* car in carArray) 
    { 
     NSNumber* power = car.enginePower; 
     if ([power compare:maxPower] == NSOrderedAscending]) 
     { 
      if (highest == nil || [power compare:highest] == NSOrderedDescending]) 
      { 
       highest = power; 
       highestCar = car; 
      } 
     } 
    } 

    return highestCar; 
} 

但没有任何理由真的为什么enginePower应该是一个NSNumber,而不是例如双。假设电力从不为负:

— (Car *)getHighestPowerFromCars:(NSArray *)carArray lessThan:(double)maxPower 
{ 
    double highestPower = -1.0; 
    Car* highestCar = nil; 

    for (Car* car in carArray) 
    { 
     double power = car.enginePower; 

     if (power < maxPower && power > highestPower)) 
     { 
      highestPower = power; 
      highestCar = car; 
     } 
    } 

    return highestCar; 
} 

但随后排序和谓词SOOOO快...

+0

我会使用提供的工具«直接»调用,而不是微观和过早的优化。 – vikingosegundo 2014-03-05 22:39:16