Как отсортировать NSMutableArray с помощью sortedArrayUsingDescriptors?

У меня вопрос о сортировке NSMutableArray . Я могу использовать sortedArrayUsingDescriptors: метод для сортировки массива с объектами.

Например, у меня есть NSMutableArray places где у меня есть frequency атрибутов (значение int), и я хочу сортировать по убыванию на frequency но я не знаю, как правильно ее использовать.

Что я ставил как ключ в initWithKey ?

place моего объекта содержит:

 NSString * name; NSString * address; NSString * frequency; NSString * type; 

 NSMutableArray * places; ... populate array with objects ... NSSortDescriptor * sortByFrequency = [[[NSSortDescriptor alloc] initWithKey:@"????????" ascending:NO] autorelease]; NSArray * descriptors = [NSArray arrayWithObject:sortByFrequency]; NSArray * sorted = [x sortedArrayUsingDescriptors:descriptors]; 

Чтобы отсортировать массив объектов, вы:

  1. setup NSSortDescriptor – используйте имена ваших переменных в качестве ключей для дескриптора установки для сортировки плюс селектор, который будет выполняться на этих клавишах
  2. получить массив дескрипторов, используя NSSortDescriptor который вы установили
  3. сортируйте свой массив на основе этих дескрипторов

Вот два примера: один использует значения NSDictionary и NSString/NSNumber сортировки по NSNumber , а другой – с использованием пользовательского classа с сортировкой по двум полям NSString .

Следуйте разделу «Сортировка и фильтрация объектов NSArray» в темах программирования cocoa, чтобы увидеть больше примеров и объяснений.

Пример :

Это было сделано на GNUStep, он должен работать одинаково на Cocoa – код точно такой же – я попробую, когда я сяду перед моим Mac:

Первый пример с использованием значений NSString и NSNumber с сортировкой по значению NSNumber :

 NSString * NAME = @"name"; NSString * ADDRESS = @"address"; NSString * FREQUENCY = @"frequency"; NSString * TYPE = @"type"; NSMutableArray * array = [NSMutableArray array]; NSDictionary * dict; dict = [NSDictionary dictionaryWithObjectsAndKeys: @"Alehandro", NAME, @"Sydney", ADDRESS, [NSNumber numberWithInt:100], FREQUENCY, @"T", TYPE, nil]; [array addObject:dict]; dict = [NSDictionary dictionaryWithObjectsAndKeys: @"Xentro", NAME, @"Melbourne", ADDRESS, [NSNumber numberWithInt:50], FREQUENCY, @"X", TYPE, nil]; [array addObject:dict]; dict = [NSDictionary dictionaryWithObjectsAndKeys: @"John", NAME, @"Perth", ADDRESS, [NSNumber numberWithInt:75], FREQUENCY, @"A", TYPE, nil]; [array addObject:dict]; dict = [NSDictionary dictionaryWithObjectsAndKeys: @"Fjord", NAME, @"Brisbane", ADDRESS, [NSNumber numberWithInt:20], FREQUENCY, @"B", TYPE, nil]; [array addObject:dict]; 

Сортировка части с использованием дескрипторов с полем частоты, которое является NSNumber :

 NSSortDescriptor * frequencyDescriptor = [[[NSSortDescriptor alloc] initWithKey:FREQUENCY ascending:YES] autorelease]; id obj; NSEnumerator * enumerator = [array objectEnumerator]; while ((obj = [enumerator nextObject])) NSLog(@"%@", obj); NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil]; NSArray * sortedArray = [array sortedArrayUsingDescriptors:descriptors]; NSLog(@"\nSorted ..."); enumerator = [sortedArray objectEnumerator]; while ((obj = [enumerator nextObject])) NSLog(@"%@", obj); 

OUTPUT – отсортировано по частоте:

 2009-12-04 x[1] {address = Sydney; frequency = 100; name = Alehandro; type = T; } 2009-12-04 x[1] {address = Melbourne; frequency = 50; name = Xentro; type = X; } 2009-12-04 x[1] {address = Perth; frequency = 75; name = John; type = A; } 2009-12-04 x[1] {address = Brisbane; frequency = 20; name = Fjord; type = B; } 2009-12-04 x[1] Sorted ... 2009-12-04 x[1] {address = Brisbane; frequency = 20; name = Fjord; type = B; } 2009-12-04 x[1] {address = Melbourne; frequency = 50; name = Xentro; type = X; } 2009-12-04 x[1] {address = Perth; frequency = 75; name = John; type = A; } 2009-12-04 x[1] {address = Sydney; frequency = 100; name = Alehandro; type = T; } 


Второй пример с пользовательским classом и сортировка по двум переменным NSString .

Массив для сортировки (см. Класс A внизу):

 NSMutableArray * array = [NSMutableArray array]; [array addObject:[[A alloc] initWithFirstName:@"Alehandro" lastName:@"Xentro" age:[NSNumber numberWithInt:40]]]; [array addObject:[[A alloc] initWithFirstName:@"John" lastName:@"Smith" age:[NSNumber numberWithInt:30]]]; [array addObject:[[A alloc] initWithFirstName:@"John" lastName:@"Smyth" age:[NSNumber numberWithInt:25]]]; [array addObject:[[A alloc] initWithFirstName:@"Torro" lastName:@"Ola" age:[NSNumber numberWithInt:45]]]; [array addObject:[[A alloc] initWithFirstName:@"Alehandro" lastName:@"Bento" age:[NSNumber numberWithInt:41]]]; [array addObject:[[A alloc] initWithFirstName:@"Alehandro" lastName:@"Axel" age:[NSNumber numberWithInt:41]]]; 

Сортировка, сортировка по lastName, затем firstName:

 NSString * LASTNAME = @"lastName"; NSString * FIRSTNAME = @"firstName"; NSSortDescriptor *lastDescriptor = [[[NSSortDescriptor alloc] initWithKey:LASTNAME ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSSortDescriptor *firstDescriptor = [[[NSSortDescriptor alloc] initWithKey:FIRSTNAME ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSArray * descriptors = [NSArray arrayWithObjects:lastDescriptor, firstDescriptor, nil]; NSArray * sortedArray = [array sortedArrayUsingDescriptors:descriptors]; по NSString * LASTNAME = @"lastName"; NSString * FIRSTNAME = @"firstName"; NSSortDescriptor *lastDescriptor = [[[NSSortDescriptor alloc] initWithKey:LASTNAME ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSSortDescriptor *firstDescriptor = [[[NSSortDescriptor alloc] initWithKey:FIRSTNAME ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSArray * descriptors = [NSArray arrayWithObjects:lastDescriptor, firstDescriptor, nil]; NSArray * sortedArray = [array sortedArrayUsingDescriptors:descriptors]; по NSString * LASTNAME = @"lastName"; NSString * FIRSTNAME = @"firstName"; NSSortDescriptor *lastDescriptor = [[[NSSortDescriptor alloc] initWithKey:LASTNAME ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSSortDescriptor *firstDescriptor = [[[NSSortDescriptor alloc] initWithKey:FIRSTNAME ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSArray * descriptors = [NSArray arrayWithObjects:lastDescriptor, firstDescriptor, nil]; NSArray * sortedArray = [array sortedArrayUsingDescriptors:descriptors]; 

Распечатайте результат:

 NSLog(@"\nSorted ..."); enumerator = [sortedArray objectEnumerator]; while ((obj = [enumerator nextObject])) NSLog(@"%@", obj); 

Результат (до и после сортировки):

 2009-12-04 00:52:16.637 x[11375] Alehandro, Xentro, age:40 2009-12-04 00:52:16.644 x[11375] John, Smith, age:30 2009-12-04 00:52:16.644 x[11375] John, Smyth, age:25 2009-12-04 00:52:16.644 x[11375] Torro, Ola, age:45 2009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:41 2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:41 2009-12-04 00:52:16.645 x[11375] Sorted ... 2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:41 2009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:41 2009-12-04 00:52:16.645 x[11375] Torro, Ola, age:45 2009-12-04 00:52:16.645 x[11375] John, Smith, age:30 2009-12-04 00:52:16.645 x[11375] John, Smyth, age:25 2009-12-04 00:52:16.645 x[11375] Alehandro, Xentro, age:40 

Класс A расширяет NSObject – здесь ничего особенного:

 #import  @interface A : NSObject { NSString * firstName; NSString * lastName; NSNumber * age; } - (id)initWithFirstName:(NSString*)aFirstName lastName:(NSString*)aLastName age:(NSNumber*)anAge; -(NSString* )description; +(NSString*)action; @end 

Реализация:

 #import  #import "Ah" @implementation A - (id)init { return [self initWithFirstName:@"N/A" lastName:@"N/A" age:0]; } - (id)initWithFirstName:(NSString*)aFirstName lastName:(NSString*)aLastName age:(NSNumber*)anAge { self = [super init]; if (!self) return nil; firstName = [aFirstName copy]; lastName = [aLastName copy]; age = [anAge copy]; return self; } - (void)dealloc { [firstName release]; [lastName release]; [age release]; [super release]; } 

 - (NSString *) description { return [NSString stringWithFormat: @"%@, %@, age:%@", firstName, lastName, age]; } @end 

«Ключ» – это метод ваших объектов (элементы вашего массива «x»), который возвращает вещь, которую вы хотите сортировать. Поэтому в этом случае вы сказали, что хотите сортировать по «частоте». Тогда все, что вам нужно сделать, это использовать имя метода, возвращающего частоту, в качестве ключа.

Вот как бы сортировать NSMutableArray:

 NSMutableArray *numberSort =[[NSMutableArray alloc] init]; while ((key = [enumerator nextObject])) { //(NSNumber *)integer = [key integerValue]; [numberSort addObject:[NSNumber numberWithInt:[key intValue]]]; // code that uses the returned key } NSArray *stringSort = [numberSort sortedArrayUsingSelector:@selector(compare:)]; enumerator = [stringSort objectEnumerator]; NSNumber *intKey; NSMutableArray *backToString =[[NSMutableArray alloc] init]; while ((intKey = [enumerator nextObject])) { //(NSNumber *)integer = [key integerValue]; [backToString addObject:[intKey stringValue]]; // code that uses the returned key 
  • Естественный порядок сортировки в C #
  • Как команда сортировки UNIX может сортировать очень большой файл?
  • Список C # Сортировать по x, тогда y
  • Оптимальный алгоритм для возврата значений верхнего k из массива длины N
  • как сортировать строку как число в datagridview в winforms
  • Быстрая сортировка Vs Merge Sort
  • Как отсортировать NSMutableArray с пользовательскими объектами в нем?
  • Сортировка ArrayList массива в Java
  • Быстрая производительность: сортировка массивов
  • Найти пару через 2 массива с k-й наибольшей суммой
  • Как сортировать элементы TreeView с помощью SortDescriptions в Xaml?
  • Interesting Posts

    Виртуальная машина хранится почти полностью, но Windows C диск говорит 29 ГБ бесплатно

    Как остановить автоматическое изменение заголовков вкладки iterm?

    Строковая интерполяция в представлении «Бритва»?

    Диспетчер задач показывает слишком много процессов exe для Google Chrome

    Библиотека Android Picasso, Как добавить заголовки аутентификации?

    Захват стандартных ошибок и ошибок с помощью Start-Process

    Лучшее программное обеспечение для резервного копирования (и, возможно, обновления)

    Ошибка кодирования с помощью HttpWebResponse

    Включая файлы содержимого в .csproj, которые находятся за пределами проектного конуса

    Правильное использование AsyncTask get ()

    ConfigurationManager не сохраняет настройки

    Почему виджет Tkinter хранится как None? (AttributeError: объект «NoneType» …) (TypeError: объект «NoneType» …)

    Выбор данных с несколькими условиями

    Звук, генерирующий Java

    Моя первая виртуальная машина

    Давайте будем гением компьютера.