Проблема сортировки NSMutableArray - PullRequest
0 голосов
/ 16 января 2011


Я знаю, что есть много вопросов по этой теме, и я прошу прощения за это, поскольку я просто не могу заставить это работать для моего NSMutableArray.У меня есть проблема, чтобы действительно понять сортировку, и я читал документацию

У меня есть NSMutableArray со следующими типами данных:

Имя игрока
Счет
Игрокимя
оценка
имя игрока
оценка
...

Это комбинация имени и оценки (NSNumber).Я пытаюсь найти способ отсортировать это на основе оценки.Я много читал, но у меня просто не получается, у меня тоже есть проблема с пониманием концепции сортировки.Я пытался отсортировать весь массив, но ...

Я был бы очень признателен, если бы кто-нибудь дал мне краткое, понятное объяснение сценария сортировки для этого, а также пример того, как сортировать это.

Редактировать: я перешел в словарь, выбрал значения и подумал отсортировать allObjects (сохраненный как NSNumber в dict), а затем просто выбрать ключ из dict на основе отсортированного объекта.

NSArray *allPlayers = [playerResultInTheGame allKeys];
NSArray *allObjects = [playerResultInTheGame allValues];

NSLog(@"allPlayers: %@", allPlayers);
NSLog(@"allObjects: %@", allObjects);

NSMutableArray *sortedArray = [allObjects   sortedArrayUsingSelector:@selector(Compare:)];

Когда я запускаю это, я получаю следующее:

2011-01-16 21: 10: 08.417 XX [6640: 207] playerResultInTheGame: {
Barnspelare= 3;
Vuxenspelare = 3;
}
2011-01-16 21: 10: 08.418 XX [6640: 207] allPlayers: (
Barnspelare,
Vuxenspelare
)
2011-01-16 21: 10: 08.418 XX [6640: 207] allObjects: (
3,
3
)
2011-01-16 21: 10: 08.419 XX [6640: 207] - [NSCFNumber Compare:]: нераспознанный селектор отправлен в экземпляр 0x5b26f10
2011-01-16 21: 10: 08.422 XX [6640: 207] * Завершение работы приложения из-за неисследованного исключения 'NSInvalidArgumentException', причина:' - [NSCFNumber Compare:]: нераспознанный селектор отправлен в экземпляр 0x5b26f10 '

Может кто-нибудь, пожалуйста, посоветуйте, поскольку я не совсем понимаю это?

Ответы [ 2 ]

2 голосов
/ 16 января 2011

Что вам нужно сделать, это сохранить свои результаты и имена игроков в словаре.Используйте имя игрока в качестве ключа (если один и тот же игрок не включен более одного раза) и счет в качестве значения.Затем сортировать игроков так же просто, как это:

NSDictionary *dict; // initialize dictionary with key/value pairs
NSArray *allPlayers = [dict allKeys];

Сортируйте массив allPlayers так, как вы хотите, затем выведите результаты из словаря.

0 голосов
/ 22 июня 2017
Lets go. 

1) You need to create array of dictionaries. 2) Then sort it. 3) Then create final array of strings and numbers from sorted array of dictionaries.    

    //for example you have this

    NSArray *allPlayers = @[@"John",@"Carl",@"Elena",@"Anna"];
    NSArray *allAges    = @[@30,    @25,    @16,     @21];

    //created storage to sort results
   NSMutableArray *sortedPlayers = [NSMutableArray new];

    [allPlayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        //I do not know if you have same count of player names and ages allways
        //so just to prevent app crash check this situation
        if (allAges.count <= idx){
            *stop = YES;
            return ;
        }

        [sortedPlayers addObject:@{
                           @"name":obj,
                           @"age":allAges[idx]
                           }];
    }];

    //let the sort begin
    [sortedPlayers sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        NSNumber *age1 = obj1[@"age"];
        NSNumber *age2 = obj2[@"age"];

        //just leave comparing to the NSNumber object
        return  [age1 compare:age2];
    }];

    NSLog(@"Wow. It works!\n:%@",sortedPlayers);

    //now you need the initial array with player\age values
    NSMutableArray *result = [NSMutableArray new];

    //append each pair to result
     for (NSDictionary *obj in sortedPlayers){

        NSString *name = obj[@"name"];
        NSNumber *age = obj[@"age"];

        [result addObject:name];
        [result addObject:age];
    }

    NSLog(@"The final result is\n:%@",result);

В консоли будет получен следующий результат:

(Елена, 16, Анна, 21, Карл, 25, Джон, 30)

...