Как позволить sortedArrayUsingSelector использование целого числа к виду вместо Строки?

У меня есть некоторые данные как это:

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.

6
задан Douwe Maan 2 May 2010 в 09:54
поделиться

2 ответа

Продолжая ответ Пола Линча, вот пример, который я делал именно так, используя метод сравнения в качестве категории на 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];
}
21
ответ дан 8 December 2019 в 02:29
поделиться

Реализуйте собственный метод, возвращающий NSComparisonResult. Он может быть в категории, если вы хотите.

0
ответ дан 8 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: