Objective-C- Получение объекта с наибольшим значением свойства - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть класс автомобилей.У него есть свойство, называемое enginePower.С другой стороны, у меня есть NSArray, который содержит более 50 автомобильных объектов.Как бы я выбрал автомобиль с наибольшей мощностью двигателя, которая при этом меньше заданного значения.Чтобы быть более ясным:

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

Теперь, из этого множества автомобилей, когда я спрашиваю автомобиль с максимальной мощностью двигателя, которая меньше 320, это должно дать мне BMW 525i.Можно ли этого добиться?Я имею в виду, есть ли хороший и простой способ или ему нужно много строк кода?

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Ответ, предоставленный @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 голос
/ 27 февраля 2012

Сортируйте массив, используя свойство мощности двигателя, затем просматривайте массив, пока не найдете значение enginePower, которое больше указанного.Затем возьмите значение объекта в currentArrayIndex - 1.

. Вы можете сделать это, используя -compareUsingSelector: для NSMutableArray или -sortedArrayUsingSelector: для NSArray (который возвратит новый, отсортированный,автоматически освобожденный массив).

В классе Car можно создать метод с именем, похожим на -compareUsingEnginePower:, который будет принимать другой объект Car в качестве параметра.

Затем вы можете сравнитьдва enginePower свойства и возвращают одно из NSOrderedSame, NSOrderedAscending или NSOrderedDescending.

0 голосов
/ 05 марта 2014

Простая итерация по массиву, поиск только автомобилей с пределом мощности и выбор одного с максимальной мощностью:

— (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;
}

Но тогда сортировка и предикаты будут такими быстрыми ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...