我有一系列的数字和字符串。喜欢
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:)];我怎样才能达到我预期的结果呢?
发布于 2016-11-02 18:37:06
你和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”、“A2-5”、"D 7-10“)
不能使用integerValue而不能使用NSNumberFormatter的原因是,例如,它会将13-2解析为13,并将其放在21之前,这不是您所期望的。NSNumberFormatter更灵活一些,如果字符串不是确切的数字,它将返回零。
发布于 2016-11-02 18:19:52
您面临的问题是,您没有“一个数字和字符串数组”,而是有一个Strings数组。它们是根据字符顺序进行比较的:比较第一个字符,如果第一个字符相同,比较第二个字符,等等。
如果您想要指定的顺序,则需要实现自定义比较器/排序方法(this answer很好地展示了各种可能性)。
https://stackoverflow.com/questions/40386964
复制相似问题