Как говорит @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);
Предостережение: он не будет правильно обрабатывать юникодную букву, состоящую из десятичной цифры, как первый компонент, но я буду считать это патологическим случаем, пока кто-то не сможет меня просветить.