Мне нужно отсортировать массив словарей, но я должен заказать объект в словарях.Сортировка NSArray NSDictionary
ответ
Использование 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, поэтому это, вероятно, не имеет значения. :-)
Перефразировать; вы хотите отсортировать массив, сравнив содержимое словаря? (I.e. вы знаете, что не можете сортировать содержимое словаря, не так ли?)
Как предложил Джошуа, используйте NSSortDescriptor
и sortedArrayUsingDescriptors:
. Это, скорее всего, лучшее решение; по крайней мере, самый простой.
Есть и другие способы.
Предполагая, что вы настроите iOS 4.0, вы можете использовать sortedArrayUsingComparator:
и передать блок, который будет сравнивать содержимое двух словарей.
Если вы ориентируетесь на iOS 3.x (включая iPad), то вы бы использовали sortedArrayUsingFunction:context:
.
Или, как предложил Джошуа, использовать NSSortDescriptor
и sortedArrayUsingDescriptors:
Все достаточно хорошо документированы, с примерами.
здесь является реализация с пользовательскими объектами вместо словарей:
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);
- 1. Сортировка NSArray путем NSDictionary значения
- 2. Сортировка NSArray из NSDictionary ... не полностью работает
- 3. Сортировка NSArray с NSDictionary внутри него
- 4. Сортировка NSArray из NSDictionary используя значение
- 5. Отсортировать NSArray из NSDictionary
- 6. Сортировка NSDictionary
- 7. NSArray Сортировка
- 8. NSDictionary вдруг становится NSArray
- 9. NSDictionary и NSArray
- 10. Вложенная задача NSArray/NSDictionary
- 11. Split NSArray на NSDictionary
- 12. Сравните NSArray с NSDictionary
- 13. Фильтр NSDictionary из NSArray
- 14. Keyless NSDictionary от NSArray
- 15. Мутирование NSDictionary внутри NSArray
- 16. Вставить NSArray в NSDictionary
- 17. NSDictionary в NSArray поиск
- 18. Передача NSArray в NSDictionary
- 19. NSDictionary для NSArray?
- 20. Преобразование NSArray в NSDictionary
- 21. Преобразование NSDictionary в NSArray
- 22. Обновление NSDictionary внутри NSArray
- 23. Поиск nsarray of nsdictionary
- 24. Преобразование NSDictionary в NSArray
- 25. Разбор NSDictionary NSArray
- 26. NSDictionary vs NsArray
- 27. Retrieving NSArray Из NSDictionary
- 28. NSDictionary к NSArray
- 29. NSDictionary + NSArray + plist
- 30. Сортировка результата NSArray wiered
Или это, да ... Я всегда забываю о сортировке дескрипторах. – bbum
У меня не было возможности самостоятельно вникать в блоки (без проектов с 10.6), но не могу дождаться начала. :-) –
ok, thx! завтра я попытаюсь реализовать эту логику – Kazzar