就像@yuri 所说,sortedArrayUsingComparator: 应该提供基本功能。
这是一个简单的版本,它将以十进制数字开头的字符串排序在以字母字符开头的字符串之后(在NSCharacterSet 的定义中),并将所有其他字符串组合保留为其默认排序顺序:
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);
警告:它不会正确处理由十进制数字组成的 unicode 字母作为第一个组件,但我会认为这是一个病态的案例,直到有人能启发我。