У меня есть некоторые данные как это:
1, 111, 2, 333, 45, 67, 322, 4445
NSArray *array = [[myData allKeys]sortedArrayUsingSelector: @selector(compare:)];
Если я выполняю этот код, он отсортировал как это:
1, 111, 2,322, 333, 4445, 45, 67,
но я на самом деле хочу это:
1, 2, 45, 67, 111, 322, 333, 4445
Как я могу реализовать его? thz u.
Продолжая ответ Пола Линча, вот пример, который я делал именно так, используя метод сравнения в качестве категории на 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];
}
Реализуйте собственный метод, возвращающий NSComparisonResult
. Он может быть в категории, если вы хотите.