我有一组数字和字符串。像
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:)];
我如何达到预期的效果?
答案 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很好地展示了可能性。)