How to let the sortedArrayUsingSelector using integer to sort instead of String?

前端 未结 5 621
心在旅途
心在旅途 2020-12-02 02:10

I have some data like this :

1, 111, 2, 333, 45, 67, 322, 4445

NSArray *array = [[myData allKeys]sortedArrayUsingSelector: @selector(compare:)];
         


        
5条回答
  •  情歌与酒
    2020-12-02 02:42

    Expanding on Paul Lynch's answer, here's an example I have doing exactly this using a comparison method as a category on NSString. This code handles only the case of numbers followed by optional non-numeric qualifiers, but you could extend it to handle cases like "1a10" etc. if desired.

    Once you create the category method, you just need to do

    [[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];
    }
    

提交回复
热议问题