iPhone - Сортировка NSMutableArray, содержащего NSDictionary с 2 ключами - PullRequest
6 голосов
/ 30 ноября 2011

Привет всем,

У меня есть NSMutableArray, содержащий различные NSDictionary. В каждом из NSDictionary у меня есть две пары ключ-значение, например: username и loginDate.

Мне нужно отсортировать все NSDictionary в этом NSMutableArray на основе убывания loginDate и возрастания имени пользователя.

Просто чтобы проиллюстрировать более подробно:

NSMutableArray (index 0): NSDictionary -> username:"user1", loginDate:20 Dec 2011
NSMutableArray (index 1): NSDictionary -> username:"user2", loginDate:15 Dec 2011
NSMutableArray (index 2): NSDictionary -> username:"user3", loginDate:28 Dec 2011
NSMutableArray (index 3): NSDictionary -> username:"user4", loginDate:28 Dec 2011

После сортировки результат в массиве должен быть:

NSMutableArray (index 0): NSDictionary -> username:"user3", loginDate:28 Dec 2011
NSMutableArray (index 1): NSDictionary -> username:"user4", loginDate:28 Dec 2011
NSMutableArray (index 2): NSDictionary -> username:"user1", loginDate:20 Dec 2011
NSMutableArray (index 3): NSDictionary -> username:"user2", loginDate:15 Dec 2011

Как мне этого добиться? Прошли некоторые из метода sortUsingComparator, не может найти способ для этого.

1 Ответ

6 голосов
/ 30 ноября 2011

Может как то так?

[array sortUsingDescriptors:
 [NSArray arrayWithObjects:
  [[[NSSortDescriptor alloc]
    initWithKey:@"loginDate"
    ascending:NO]
   autorelease],
  [[[NSSortDescriptor alloc]
    initWithKey:@"username"
    ascending:YES]
   autorelease],
  nil]];

Если вы собираете для iOS 4 или выше, вы даже можете сделать:

[array sortUsingDescriptors:
 [NSArray arrayWithObjects:
  [NSSortDescriptor sortDescriptorWithKey:@"loginDate" ascending:NO],
  [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES],
  nil]];

Это работает с использованием метода compare: для сравнения значений ключа свойства, то есть значения, возвращаемого valueForKey:. В случае NSDictionary он будет более или менее просто вызывать objectForKey:, чтобы получить значение. Существуют некоторые специальные обозначения, такие как добавление префикса имени ключа к «@», для получения более подробной информации см. Значение разницы для ключа объектаForKey .

...