對Paul Lynch的回答進行了擴展,下面是一個使用比較方法作爲NSString
上的類別完成此操作的示例。此代碼僅處理數字後跟可選非數字限定符的情況,但如果需要,可以將其擴展爲處理「1a10」等情況。
一旦你創建的類中的方法,你只需要做
[[myData allKeys]sortedArrayUsingSelector:@selector(psuedoNumericCompare:)];
@interface NSString (Support)
- (NSComparisonResult) psuedoNumericCompare:(NSString *)otherString;
@end
@implementation NSString (Support)
// "psuedo-numeric" comparison
// -- if both strings begin with digits, numeric comparison on the digits
// -- if numbers equal (or non-numeric), caseInsensitiveCompare on the remainder
- (NSComparisonResult) psuedoNumericCompare:(NSString *)otherString {
NSString *left = self;
NSString *right = otherString;
NSInteger leftNumber, rightNumber;
NSScanner *leftScanner = [NSScanner scannerWithString:left];
NSScanner *rightScanner = [NSScanner scannerWithString:right];
// if both begin with numbers, numeric comparison takes precedence
if ([leftScanner scanInteger:&leftNumber] && [rightScanner scanInteger:&rightNumber]) {
if (leftNumber < rightNumber)
return NSOrderedAscending;
if (leftNumber > rightNumber)
return NSOrderedDescending;
// if numeric values tied, compare the rest
left = [left substringFromIndex:[leftScanner scanLocation]];
right = [right substringFromIndex:[rightScanner scanLocation]];
}
return [left caseInsensitiveCompare:right];
}
數組中的對象是什麼類--NSString或NSNumber? – sbooth 2010-05-02 09:34:06
這是NSString ......但我不想改成NSNumber。這是因爲它將來可能會有像「1a」這樣的一些數據。 – Tattat 2010-05-02 09:40:55
1a如何與1和10共處? – Mark 2010-05-02 09:46:40