Как отсортировать NSMutableArray объектов по члену его класса, то есть int или float - PullRequest
4 голосов
/ 23 апреля 2010

У меня есть класс (от NSObject), который содержит:

NSString name
int      position
float    speed

Затем я создаю массив (NSMutableArray) объектов из этого класса. Я хотел бы затем отсортировать массив по значению «скорость», которое является float.

У меня изначально есть значение float как NSNumber и int как NSInteger, и я успешно сортировал по:

[myMutableArray sortUsingFunction:compareSelector context:@selector(position)];

, где myMutableArray - мой массив объектов.

вот функция:

static int compareSelector(id p1, id p2, void *context) {
    SEL methodSelector = (SEL)context;
    id value1 = [p1 performSelector:methodSelector];
    id value2 = [p2 performSelector:methodSelector];
    return [value1 compare:value2];
}

Теперь, когда я использую int вместо NSInteger, приведенный выше код не работает. Есть ли команда более низкого уровня, которую я должен использовать для выполнения сортировки? Спасибо!

Ответы [ 2 ]

5 голосов
/ 24 апреля 2010

Аналогично drawonward, я бы предложил добавить метод сравнения в ваш класс:

- (NSComparisonResult)compareSpeed:(id)otherObject
{
    if ([self speed] > [otherObject speed]) {
        return NSOrderedDescending;
    } else if ([self speed] < [otherObject speed]) {
        return NSOrderedAscending;
    } else {
        return NSOrderedSame;
    }
}

(Вы можете свернуть if - else if - else, используя троичный оператор: test ? trueValue : falseValue, или если speed является объектом с методом compare: (например, NSNumber), вы можете просто return [[self speed] compare:[otherObject speed]];.)

Затем вы можете отсортировать по

[myMutableArray sortUsingSelector:@selector(compareSpeed:)];

Как предложил Георг в комментарии, вы также можете достичь своей цели, используя NSSortDescriptor; если вы нацелены на 10,6, вы также можете использовать блоки и sortUsingComparator:(NSComparator)cmptr.

1 голос
/ 23 апреля 2010
int compareSpeed( id p1 , id p2 , void *unused ) {
  return p1->speed > p2->speed ? 1 : p1->speed < p2->speed : -1 : 0;
}

Хотя на самом деле вы должны сделать приведенный выше метод вашего класса следующим образом:

-(int) compareSpeed:(id)inOtherObjectOfSameType {
  return self->speed > inOtherObjectOfSameType->speed ? 1 : self->speed < inOtherObjectOfSameType->speed : -1 : 0;
}
...