Objective-c сортирует массив по последнему объекту - PullRequest
0 голосов
/ 21 февраля 2012

У меня проблема с массивом сортировки массивов.Я уже создал метод сортировки, но он не работает должным образом.Я имею в виду, что финальная таблица должна быть отсортирована по последнему элементу в порядке убывания с использованием последнего элемента.

Мой метод:

static NSInteger order (id a, id b, void* context) 
        {
        NSNumber* catA = [a lastObject];
        NSNumber* catB = [b lastObject];
        return [ catB compare: catA];
        }

И вызвать его по:

[ array sortUsingFunction:order context:NULL];

И мой массив выглядит так:

{1,9}
{1,6}
{1,5}
{2,2}
{0,18}
{12, 10}
{9,1}

Где проблема?

1 Ответ

3 голосов
/ 21 февраля 2012

Вы не скажете точно, что не так с массивом после его сортировки.Я вижу две возможные проблемы.

  1. Как говорит Эймантас в своем комментарии, вы сортируете массив в обратном порядке (от высшего к низшему).Если вы хотите отсортировать от низшего к высшему, вы должны сказать return [catA compare:catB].

  2. Похоже, элементы catA и catB являются строками, а не числами, поэтому высортируют их как строки.Строка '10' меньше, чем строка '9', но число 10 больше, чем число 9. Даже если вы приводите элементы к NSNumber, это не меняет тип нижележащего объекта, которыйstill NSString.

Вы можете отсортировать их как числа следующим образом:

[array sortUsingComparator:^(id a, id b) {
    return [[a lastObject] intValue] - [[b lastObject] intValue];
}]

Но может быть лучше преобразовать строки в числовые объекты перед сортировкоймассив:

for (NSMutableArray *element in array) {
    [element replaceObjectAtIndex:(element.count - 1)
        withObject:[NSNumber numberWithInt:[element.lastObject intValue]]];
}

[array sortUsingComparator:^(id a, id b) {
    return [[a lastObject] intValue] - [[b lastObject] intValue];
}]
...