Сортировка NSArray из NSDictionary - PullRequest
       10

Сортировка NSArray из NSDictionary

3 голосов
/ 13 октября 2010

Я должен отсортировать массив словарей, но мне нужно упорядочить по объектам в словарях.

Ответы [ 3 ]

13 голосов
/ 13 октября 2010

Использовать NSSortDescriptors с -sortedArrayUsingDescriptors :.В качестве ключевого пути передайте ключ словаря, а затем ключ (и) объекта, по которому вы хотите выполнить сортировку.В следующем примере у вас есть массив словарей, и в этих словарях есть персона под «personDictionaryKey», а у «персоны» есть ключ «lastName».

NSSortDescriptor * descriptor = [[[NSSortDescriptor alloc] initWithKey:@"personInDictionary.lastName" 
        ascending:YES] autorelease]; // 1
NSArray * sortedArray = [unsortedArray sortedArrayUsingDescriptors:
        [NSArray arrayWithObject:descriptor]];

1 - В 10.6 есть удобные методы класса для создания дескрипторов сортировки, но, как говорит ответ bbum, теперь есть методы сортировки с поддержкой блоков, и я держу пари, что они намного быстрее.Кроме того, я заметил, что ваш вопрос касается iOS, так что это, вероятно, не имеет значения.: -)

1 голос
/ 13 октября 2010

Перефразировать; Вы хотите отсортировать массив путем сравнения содержимого словаря? (Т.е. вы знаете, что не можете отсортировать содержимое словаря, верно?)

Как предложил Джошуа, используйте NSSortDescriptor и sortedArrayUsingDescriptors:. Это, скорее всего, лучшее решение; по крайней мере, самый простой.

Есть и другие способы.

Если вы нацелены на iOS 4.0, тогда вы можете использовать sortedArrayUsingComparator: и передать блок, который будет сравнивать содержимое двух словарей.

Если вы ориентируетесь на iOS 3.x (включая iPad), вы должны использовать sortedArrayUsingFunction:context:.

Или, как предложил Иисус, используйте NSSortDescriptor и sortedArrayUsingDescriptors:

Все довольно хорошо задокументированы, с примерами.

0 голосов
/ 14 октября 2010

вот реализация с пользовательскими объектами вместо словарей:

ArtistVO *artist1 = [ArtistVO alloc];
artist1.name = @"Trentemoeller";
artist1.imgPath = @"imgPath";

ArtistVO *artist2 = [ArtistVO alloc];
artist2.name = @"ATrentemoeller";
artist2.imgPath = @"imgPath2";


ArtistVO *artist3 = [ArtistVO alloc];
artist3.name = @"APhextwin";
artist3.imgPath = @"imgPath2";    

//NSLog(@"%@", artist1.name);
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:artist1];
[arr addObject:artist2];
[arr addObject:artist3];


NSSortDescriptor *lastDescriptor =
[[[NSSortDescriptor alloc]
  initWithKey:@"name"
  ascending:YES
  selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];    

NSArray * descriptors =
[NSArray arrayWithObjects:lastDescriptor, nil];
NSArray * sortedArray =
[arr sortedArrayUsingDescriptors:descriptors];    

NSLog(@"\nSorted ...");
NSEnumerator *enumerator;
enumerator = [sortedArray objectEnumerator];

ArtistVO *tmpARt;
while ((tmpARt = [enumerator nextObject])) NSLog(@"%@", tmpARt.name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...