iOS - SortDescriptor,其中内容是字母和数字

iOS - SortDescriptor where content is both alpha and numeric

我见过很多关于如何对 1,10,2,3 等进行排序的问题

我有一些 Json 数据以以下形式导入:@"arrived"@"boarding"@"1"@"2"@"3" 等。 .

我目前只有不区分大小写的排序:

sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:YES selector:@selector(caseInsensitiveCompare:)];

这会首先对数字进行排序,最后对单词进行排序,这是我在上面显示的表格中需要的地方。

我有什么选择可以做到这一点?谢谢

试试这个

    NSComparator compare=^(id obj1, id obj2) {
    NSString *s1 = [obj1 substringToIndex:1];
    NSString *s2 = [obj2 substringToIndex:1];

    NSRange r1 = [s1 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]];
    NSRange r2 = [s2 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]];
    if (r1.location == r2.location ) { // either both start with a number or both with a letter
        return [obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch];
    } else {  // one starts wit a letter, the other with a number
        if ([s1 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == NSNotFound) {
            return NSOrderedAscending;
        }
        return NSOrderedDescending;
    }
};

NSSortDescriptor *desc=[[NSSortDescriptor alloc]initWithKey:@"time" ascending:YES comparator:compare];

originalArray =  [originalArray sortedArrayUsingDescriptors:@[desc]];

可能对你有帮助。

这个冗长的比较器可以解决问题:

NSArray *testArray = @[@"3", @"boarding", @"2", @"arrived", @"1"];

NSArray *sortedArray = [testArray sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
    NSInteger firstInteger = 0;
    BOOL isInteger1 = [[NSScanner scannerWithString:obj1] scanInteger:&firstInteger];

    NSInteger secondInteger = 0;
    BOOL isInteger2 = [[NSScanner scannerWithString:obj2] scanInteger:&secondInteger];

    if (isInteger1 && isInteger2) {
        // Normal integer comparison
        if (firstInteger > secondInteger) {
            return NSOrderedDescending;
        }
        else if (secondInteger > firstInteger) {
            return NSOrderedAscending;
        }
        else {
            return NSOrderedSame;
        }
    }
    else if (isInteger1) {
        return NSOrderedDescending;
    }
    else if (isInteger2) {
        return NSOrderedAscending;
    }
    else {
        return [obj1 compare:obj2 options:NSCaseInsensitiveSearch];
    }
}];

编辑

示例输出:

Printing description of sortedArray:
<__NSArrayI 0x7ffacaa26da0>(
arrived,
boarding,
1,
2,
3