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
我见过很多关于如何对 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