I need to generate a sorted array of NSNumber
s from another NSArray
. I want to use the sortedArrayUsingComparator:
method. I found this example in the Apple documentation:
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
Here I am just providing the comparator in a block, which is fine. The sort itself -- the bit that's hidden from me, which uses this block -- appears to be ascending.
I'd like to know if I can request a different sort order external to this block, or do I just need to flip the <
and >
's (or NSOrderedXXX
's) around?
If you want to sort descending, then just flip the comparisons (or flip the NSComparisonResult
s). There's no need to bloat the API by having an ascending:
parameter when you can control that in the block directly.
From the documentation for -sortedArrayUsingComparator:
:
"Returns an array that lists the receiving array’s elements in ascending order, as determined by the comparison method specified by a given NSComparator Block."
So You'd have to resort to using
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
but of course that means rolling your own NSSortDescriptor objects first, which may suit your purposes just fine.
You can flip the operators around.
The "bit that's hidden from you" doesn't care about ascending or descending, as it doesn't know anything about your objects. It's like asking your co-worker if a hockey puck is greater or less than a muskrat. The internal implementation just uses a sorting algorithm (which is probably determined using the size of your array) and uses your block function to compare two objects.
Just change the logic:
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
return (NSComparisonResult)NSOrderedSame;
}];
For clarity it might be best to make this a method with a name similar to: decendingSort
.
As a side note, you are able to get the reversed order of an array using this
[[NSArray reverseObjectEnumerator] allObjects];
来源:https://stackoverflow.com/questions/8054921/changing-the-sort-order-of-nsarray-sortedarrayusingcomparator