不要只
return [self.name compare:otherObject.name options:(NSCaseInsensitiveSearch)];
但做一些額外的檢查,例如如果self.name以非數字開頭,otherObject.name以數字開頭,則返回NSDescendingOrder,反之亦然。 IOW,使數字>非數字。如果兩者都是非數字或兩者都是數字,請返回您已有的數字。
這個小控制檯程序解釋我的意思是這樣的原則:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *array = [NSMutableArray arrayWithObjects:
@"Adam", @"001", @"Bertha", @"3SeriesBMW", @"Colin",
@"Zelda", @"1And1", @"Xaver", @"Kraftwerk", @"TangerineDream",
@"5SeriesBMW", @"0ableTypes", nil];
NSString *sortOrder = @"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz_";
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
char char1 = [(NSString *)obj1 characterAtIndex: 0];
char char2 = [(NSString *)obj2 characterAtIndex: 0];
int index1;
for (index1 = 0; index1 < sortOrder.length; index1++)
if ([sortOrder characterAtIndex: index1] == char1)
break;
int index2;
for (index2 = 0; index2 < sortOrder.length; index2++)
if ([sortOrder characterAtIndex: index2] == char2)
break;
if (index1 < index2)
return NSOrderedAscending;
else if (index1 > index2)
return NSOrderedDescending;
else
return [(NSString *)obj1 compare: obj2 options: NSCaseInsensitiveSearch];
}];
for (NSString *s in array)
NSLog(@"%@", s);
[pool drain];
return 0;
}
輸出是:
2011-08-25 14:19:15.538 NumeralSort[5802:707] Adam
2011-08-25 14:19:15.540 NumeralSort[5802:707] Bertha
2011-08-25 14:19:15.540 NumeralSort[5802:707] Colin
2011-08-25 14:19:15.540 NumeralSort[5802:707] Kraftwerk
2011-08-25 14:19:15.541 NumeralSort[5802:707] TangerineDream
2011-08-25 14:19:15.541 NumeralSort[5802:707] Xaver
2011-08-25 14:19:15.541 NumeralSort[5802:707] Zelda
2011-08-25 14:19:15.542 NumeralSort[5802:707] 001
2011-08-25 14:19:15.542 NumeralSort[5802:707] 0ableTypes
2011-08-25 14:19:15.542 NumeralSort[5802:707] 1And1
2011-08-25 14:19:15.543 NumeralSort[5802:707] 3SeriesBMW
2011-08-25 14:19:15.543 NumeralSort[5802:707] 5SeriesBMW
這是不完全的解決方案,但應該讓你對你的方式。
這工作的一種享受,感謝您的幫助! – steemcb
我如何在NSSortDescriptor中使用它? – Raj