对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