我有一个汽车课。它有一个名为enginePower的属性。另一方面,我有一个包含50多个汽车对象的NSArray。如何选择具有最高enginePower且同时小于给定值的汽车。更清楚:
BMW X5-345 hp
Audi A3-200 hp
BMW 525i -225 hp
VW Passat CC-175 hp
.....
现在,当我要求拥有最高发动机功率低于320的汽车时,从这一系列汽车中我应该给我宝马525i。是否有可能实现。我的意思是有一个简单的方法,还是需要大量的代码?
答案 0 :(得分: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];
}
答案 1 :(得分:1)
使用engine power属性对数组进行排序,然后循环遍历数组,直到找到大于指定值的enginePower
值。然后在currentArrayIndex - 1
中获取对象的值。
您可以使用-compareUsingSelector:
上的NSMutableArray
或-sortedArrayUsingSelector:
上的NSArray
来执行此操作(这将返回一个新的,已排序的自动释放数组)。
您可以在名为Car
的{{1}}类上创建一个方法,该方法将另一个-compareUsingEnginePower:
对象作为参数。
然后,您可以比较两个Car
属性,并返回enginePower
,NSOrderedSame
或NSOrderedAscending
中的一个。
答案 2 :(得分:-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;
}
但是排序和谓词太快了......