对数字和字符串数组进行排序

时间:2016-11-02 18:13:36

标签: ios objective-c arrays sorting

我有一组数字和字符串。像

NSArray* list = @[@"9", @"21", @"A 2-5", @"19-1", @"10", @"D 7-10", @"13-2"];

我想将此数组排序为

@[@"9", @"10", @"21", @"13-2", @"19-1", @"A 2-5", @"D 7-10"];

但如果我使用

[list sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
    return [obj1 compare:obj2];
}];

我得到了

@[@"10", @"13-2", @"19-1", @"21", @"9", @"A 2-5", @"D 7-10"];

如果我使用

,我也会得到类似的结果
[list sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

我如何达到预期的效果?

2 个答案:

答案 0 :(得分:1)

您与sortedArrayUsingComparator走在了正确的轨道上。以下是如何实现它:

NSArray* list = @[@"9", @"21", @"A 2-5", @"19-1", @"10", @"D 7-10", @"13-2"];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSArray *sortedList = [list sortedArrayUsingComparator:^NSComparisonResult(NSString *string1, NSString *string2) {
        NSNumber *number1 = [numberFormatter numberFromString:string1];
        NSNumber *number2 = [numberFormatter numberFromString:string2];

        if (number1 && number2)
            return [number1 compare:number2];
        else if (number1)
            return NSOrderedAscending;
        else if (number2)
            return NSOrderedDescending;
        else return [string1 compare:string2];
}];
NSLog(@"sortedList: %@", sortedList);

输出:

  

(       9,       10,       21,       “13-2”,       “19-1”,       “A 2-5”,       “D 7-10”)

您无法使用integerValue代替NSNumberFormatter的原因是,例如,它会将13-2解析为13,它将在21之前使用1}},这不是你所期望的。 NSNumberFormatter更灵活,如果字符串不是一个数字,则返回nil。

答案 1 :(得分:0)

您面临的问题是没有拥有“数组和字符串数组”,您有一个Strings数组。它们根据字符序列进行比较:比较第一个字符,如果第一个字符相同,则比较第二个字符等。这将导致您获得的顺序。

如果你想要你指定的订单,你需要实现一个自定义的比较/排序方法(this answer很好地展示了可能性。)