Как мне сортировать NSMutable Array с NSNumbers в нем?
Я пытаюсь сделать таблицу с высоким рейтингом и сосать массивы в объективе c (на самом деле, в целом цель c для меня сложна), поэтому я не могу понять, как сортировать. Я пытаюсь сделать что-то вроде этого (speudocode, я пишу это в стиле ActionScript, потому что мне более комфортно):
highscores.addObjecttoArray(score)
highscores.sort(ascending)
Но я не могу понять это... Я видел другие темы об этом, но их используют файлы plist и прочее, и я не знаю достаточно объективного c, чтобы учиться у них.
Ответы
Ответ 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]]];