Подтвердить что ты не робот

Как мне сортировать NSMutable Array с NSNumbers в нем?

Я пытаюсь сделать таблицу с высоким рейтингом и сосать массивы в объективе c (на самом деле, в целом цель c для меня сложна), поэтому я не могу понять, как сортировать. Я пытаюсь сделать что-то вроде этого (speudocode, я пишу это в стиле ActionScript, потому что мне более комфортно):

highscores.addObjecttoArray(score)
highscores.sort(ascending)

Но я не могу понять это... Я видел другие темы об этом, но их используют файлы plist и прочее, и я не знаю достаточно объективного c, чтобы учиться у них.

4b9b3361

Ответ 1

Вы хотите сделать это на короткое время?

Если у вас есть изменяемый массив экземпляров NSNumber:

NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];

Приятно и легко:)

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

Ответ 2

[highscores sortUsingSelector:@selector(compare:)];

Должен работать, если они определенно все NSNumber s.

(Добавление объекта:

[highscores addObject:score];

)

Если вы хотите сортировать нисходящий (самый высокий):

10.6/iOS 4:

[highscores sortUsingComparator:^(id obj1, id obj2) {
    if (obj1 > obj2)
        return NSOrderedAscending;
    else if (obj1 < obj2)
        return NSOrderedDescending;

    return NSOrderedSame;
}];

В противном случае вы можете определить метод категории, например:

@interface NSNumber (CustomSorting)

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber;

@end

@implementation NSMutableArray (CustomSorting)

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber {
    return [otherNumber compare:self];
}

@end

И назовите его:

[highscores sortUsingSelector:@selector(reverseCompare:)];

Ответ 3

Я попробовал ответ, предоставленный ohhorob, но объекты все еще сортировались в алфавитном порядке. Затем я просмотрел это в другом ответе (fooobar.com/questions/118428/...):

Я изменил свой NSSortDescriptor, и теперь он сортируется численно.

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score"
                                               ascending:YES
                                              comparator:^(id obj1, id obj2) {
    return [obj1 compare:obj2 options:NSNumericSearch];
}];

Я просто подумал, что брошу это здесь, потому что он решил мою "алфавитную сортировку проблемы NSNumbers"

Ответ 4

расстояние - это ключ и его значение (плавающее или двойное)

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance"
ascending:YES
comparator:^(id obj1, id obj2)
                     {
                  return [obj1 compare:obj2 options:NSNumericSearch];
                     }];
NSArray *myArray = [NSArray arrayWithArray:arraySubCat];
myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]];
arraySubCat = [myArray copy];

Ответ 5

Для всего этого стоит другой сокращенный метод:

NSArray* n = @[@8, @3, @1, @12, @16, @7, @0, @5];

NSArray* asc = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
            return [n1 compare:n2];
        }];
NSLog(@"Ascending: %@", asc);

NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
           return [n2 compare:n1];
       }];
NSLog(@"Descending: %@", dec);

Ответ 6

Этот код будет сортировать NSMutableArray NSNumber в порядке возрастания:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2];
}];

Этот код будет сортировать NSMutableArray из NSNumber в порядке убывания:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2] * -1; // reverse the enum
}];

В коде используется тот факт, что метод NSNumber compare: возвращает NSComparisonResult, который варьируется от -1 до 1. Умножение результата сравнения на -1 отменяет результат и тем самым отменяет сортировку в порядке убывания.

Ответ 7

Для Descending Заказ:

NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors:
                                @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
                                                                ascending:NO]]];

В порядке возрастания

NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors:
                                @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
                                                                ascending:YES]]];