Like @yuri says, sortedArrayUsingComparator:
should provide the basic functionality.
Here is a simple version that sorts strings beginning with a decimal digit after strings beginning with an alphabetic character (in NSCharacterSet
's definition), and leaves all other combinations of strings to their default sort order:
NSArray *arr = [NSArray arrayWithObjects:
@"ABC 09 GHJ", @"DEF23PO", @"123ABC", @"MCMLXV", @"[cocoa]", @"$2000", @"ERT", @"24seven", @"zero",
@"Ångström", @"Übernacht",
nil];
NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *alphanums = [NSCharacterSet alphanumericCharacterSet];
NSArray *sorted = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ( [obj1 isKindOfClass:[NSString class]] && [obj1 length] > 0
&& [obj2 isKindOfClass:[NSString class]] && [obj2 length] > 0 ) {
unichar c1 = [obj1 characterAtIndex:0];
unichar c2 = [obj2 characterAtIndex:0];
if ( [digits characterIsMember:c1] && (![digits characterIsMember:c2] && [alphanums characterIsMember:c2]) ) {
return NSOrderedDescending;
}
if ( [digits characterIsMember:c2] && (![digits characterIsMember:c1] && [alphanums characterIsMember:c1]) ) {
return NSOrderedAscending;
}
}
return [obj1 compare: obj2];
}];
NSLog(@"Sorted: %@", sorted);
Caveat: It will not handle a unicode letter composed of a decimal digit as the first component correctly, but I will consider that a pathological case until someone can enlighten me.