I\'m trying to make a high score table, and suck at arrays in objective c (actually, in general objective c is challenging for me), so I can\'t figure out how to sort. I\'m
I tried the answer provided by ohhorob, but the objects were still being sorted alphabetically. Then I ran across this in another answer (https://stackoverflow.com/a/4550451/823356):
I changed my NSSortDescriptor and it now sorts numerically.
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score"
ascending:YES
comparator:^(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
I just thought I'd drop this in here as it solved my 'alphabetical sorting of NSNumbers' problem
distance is a key and it's value link (float or double)
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];
[highscores sortUsingSelector:@selector(compare:)];
Should work if they're definitely all NSNumber
s.
(Adding an object is:
[highscores addObject:score];
)
If you want to sort descending (highest-first):
10.6/iOS 4:
[highscores sortUsingComparator:^(id obj1, id obj2) {
if (obj1 > obj2)
return NSOrderedAscending;
else if (obj1 < obj2)
return NSOrderedDescending;
return NSOrderedSame;
}];
Otherwise you can define a category method, e.g.:
@interface NSNumber (CustomSorting)
- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber;
@end
@implementation NSMutableArray (CustomSorting)
- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber {
return [otherNumber compare:self];
}
@end
And call it:
[highscores sortUsingSelector:@selector(reverseCompare:)];
This code will sort an NSMutableArray of NSNumber in ascending order:
[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
This code will sort an NSMutableArray of NSNumber in descending order:
[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2] * -1; // reverse the enum
}];
The code uses the fact that the NSNumber compare: method returns an NSComparisonResult that ranges from -1 to 1. Multiplying the result of the compare by -1 reverses the result and thereby reverses the sort to descending order.
For Descending Order:
NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors:
@[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
ascending:NO]]];
For ascending Order
NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors:
@[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
ascending:YES]]];
Would you like to do that the short way?
If you have a mutable array of NSNumber
instances:
NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];
Nice and easy :)
You can also perform similar sorting with descriptors on immutable arrays, but you will end up with a copy, instead of in-place sorting.