Сортировать массив в порядке убывания..?

Извините за глупый вопрос..

У меня есть массив с объектами класса, такими как:

Class User {
     NSString *firstName, *LastName;
}
@property (nonatomic, retail) NSString *firstName;
@property (nonatomic, retail) NSString *LastName;

Я создаю объект этого класса и добавляю его в NSMutableArray.

Теперь я хочу отсортировать этот массив по имени. Любая идея, пожалуйста.

Могу ли я использовать NSSortDescriptor для сортировки этого массива или мне нужно использовать свою пользовательскую логику.

Я сделал это раньше, но теперь я забыл об этом, и сейчас у меня нет исходного кода для этого...

Пожалуйста, помогите мне .. Спасибо

EDIT: Я получил несколько любезных ответов и попытался, но не получилось. Я разбираю JSON, поэтому в myArray будет неизвестное количество объектов. Итак, я использовал:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES];
[myArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

и

 NSMutableArray *tempArray = [myArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

но ничего не получилось..

Edit 2

Вот описание: Массив

    "<User: 0xa3f13c0>",
    "<User: 0xa3f1410>",
    "<User: 0xa3f1450>",
    "<User: 0xa3f1490>"

Сортированный массив

"<User: 0xa3f13c0>",
"<User: 0xa3f1410>",
"<User: 0xa3f1490>",
"<User: 0xa3f1450>"

В цикле: массив

John
abc
test
qwertg

Сортированный массив

John
abc
test
qwertg

person Kapil Choubisa    schedule 28.04.2011    source источник
comment
Не могли бы вы опубликовать вывод NSLog обоих массивов до и после сортировки? Я бы перед этим добавил переопределение описания в класс User, оно должно выглядеть примерно так: -(NSString *)description { return [NSString stringWithFormat:@Firstname - %@, self.firstName];}   -  person Zaky German    schedule 28.04.2011


Ответы (2)


Если вы нацелены на iOS4+, вы можете использовать метод sortUsingComparator::

[yourArray sortUsingComparator:^(id obj1, id obj2){

        User* u1 = (User*)obj1;
        User* u2 = (User*)obj2;
        return [u1.firstName compare:u2.firstName];
    }];

Редактировать: поскольку метод сравнения учитывает регистр символов, вам может потребоваться использовать вместо него метод caseInsensitiveCompare::

[yourArray sortUsingComparator:^(id obj1, id obj2){

        User* u1 = (User*)obj1;
        User* u2 = (User*)obj2;
        return [u1.firstName caseInsensitiveCompare:u2.firstName];
    }];
person Vladimir    schedule 28.04.2011
comment
Спасибо @Vladimir `caseInsensitiveCompare работает как шарм .. Большое спасибо. - person Kapil Choubisa; 28.04.2011
comment
Можно сократить: ^(User* u1, User* u2) { return [u1.firstName caseInsensitiveCompare:u2.firstName]; } - person SSteve; 04.07.2012

Это, вероятно, самый чистый способ сделать то, что вы ищете:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES];
[myArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

Интересный способ сортировки массивов — использование блоков кода, если вам не нужна обратная совместимость до ios4.

[myMutableArray sortUsingComparator:
^(id a, id b) 
{
    User *userA = (User *)a;
    User *userB = (User *)b;
    return [userA.firstName compare:userB.firstName]; 
}];

Это позволит вам добавить туда дополнительную логику на тот случай, если в будущем вы захотите использовать дополнительные или другие условия сортировки.

person Zaky German    schedule 28.04.2011
comment
Если вам нужна дополнительная логика без использования блоков, вы можете использовать sortUsingSelector:. - person vakio; 28.04.2011
comment
Я уже использую первый способ, указанный вами, но он не сортирует мои данные. - person Kapil Choubisa; 28.04.2011
comment
@Kapil Choubisa, вы используете sortUsingX или sortedArrayUsingX? - person Zaky German; 28.04.2011
comment
да, я обновил свой вопрос. В нем я разместил код, который использую. Точно так же я использовал компаратор. - person Kapil Choubisa; 28.04.2011