Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing the sort order of -[NSArray sortedArrayUsingComparator:]

I need to generate a sorted array of NSNumbers 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?

like image 869
Tim Avatar asked Nov 08 '11 17:11

Tim


3 Answers

If you want to sort descending, then just flip the comparisons (or flip the NSComparisonResults). There's no need to bloat the API by having an ascending: parameter when you can control that in the block directly.

like image 52
Lily Ballard Avatar answered Nov 01 '22 12:11

Lily Ballard


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.

like image 5
zaph Avatar answered Nov 01 '22 10:11

zaph


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.

like image 4
God of Biscuits Avatar answered Nov 01 '22 10:11

God of Biscuits