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

Используйте Java для переводчика C# на реализации Java (java.util. PriorityQueue) в платформе Наборов Java, или более разумно используют алгоритм и базовый код и включают его в класс C# Вашего собственного создания, которое придерживается API платформы Наборов C# для Очередей, или по крайней мере Наборов.

28
задан Cœur 16 April 2017 в 07:51
поделиться

3 ответа

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

2
ответ дан 28 November 2019 в 02:16
поделиться

Вот как можно отсортировать 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 
1
ответ дан 28 November 2019 в 02:16
поделиться

Для сортировки вашего массива объектов вы:

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

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

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

Пример :

Это было сделано в 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];

Сортировочная часть с использованием дескрипторов с полем Frequency, которое равно 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; }


Второй пример с настраиваемым классом и сортировкой по двум переменным 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];

Вывести результат:

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

Class A extends NSObject - здесь ничего особенного:

#import <Foundation/Foundation.h>

@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 <Foundation/Foundation.h>
#import "A.h"

@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
111
ответ дан 28 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: