2012-02-27 66 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