2010-10-13 7 views

ответ

13

Использование 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, поэтому это, вероятно, не имеет значения. :-)

+0

Или это, да ... Я всегда забываю о сортировке дескрипторах. – bbum

+0

У меня не было возможности самостоятельно вникать в блоки (без проектов с 10.6), но не могу дождаться начала. :-) –

+0

ok, thx! завтра я попытаюсь реализовать эту логику – Kazzar

1

Перефразировать; вы хотите отсортировать массив, сравнив содержимое словаря? (I.e. вы знаете, что не можете сортировать содержимое словаря, не так ли?)

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

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

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

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

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

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

0

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

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); 
Смежные вопросы