Short and to the point, I used the new syntax for array literals for brevity's sake.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSArray *ar = @[@"B", @"A", @"C", @"B", @"B", @"A"];
NSCountedSet *countedSet = [NSCountedSet setWithArray:ar];
NSArray *sorted = [ar sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSInteger diff = [countedSet countForObject:obj1] - [countedSet countForObject:obj2];
if (diff < 0)
return NSOrderedDescending;
else if (diff > 0)
return NSOrderedAscending;
else
return NSOrderedSame;
}];
NSLog(@"%@", ar);
NSLog(@"%@", sorted);
}
return 0;
}
Output
2012-05-08 07:25:18.465 Sort[20434:303] (
B,
A,
C,
B,
B,
A
)
2012-05-08 07:25:18.468 Sort[20434:303] (
B,
B,
B,
A,
A,
C
)