Objective-C-获取具有最大属性值的对象

时间:2012-02-27 19:40:11

标签: objective-c nsarray

我有一个汽车课。它有一个名为enginePower的属性。另一方面,我有一个包含50多个汽车对象的NSArray。如何选择具有最高enginePower且同时小于给定值的汽车。更清楚:

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

现在,当我要求拥有最高发动机功率低于320的汽车时,从这一系列汽车中我应该给我宝马525i。是否有可能实现。我的意思是有一个简单的方法,还是需要大量的代码?

3 个答案:

答案 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属性,并返回enginePowerNSOrderedSameNSOrderedAscending中的一个。

答案 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;
}

但是排序和谓词太快了......