我想排序包含字符串以及诸如a,b,1 a,2 a,2 a,v,z,10 b之类的数字,我想以这种方式对a,b,b,,v,z,1 a,2 a,10 B.我在堆栈溢出上搜索,但没有发现有用的。
请帮助...
您可以使用比较器块根据它们的类型对数组中的对象进行排序。类似:
NSArray *array = @[ @"A", @"B", @1, @2, @"V", @"Z", @10 ];
NSArray *result = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
// If the objects are the same class, compare them normally
if ([[obj1 class] isEqual:[obj2 class]]) {
return (NSComparisonResult)[obj1 compare:obj2];
}
// If the objects are different classes, numbers go after strings
if ([obj1 isKindOfClass:[NSNumber class]] && [obj2 isKindOfClass:[NSString class]]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj2 isKindOfClass:[NSNumber class]] && [obj1 isKindOfClass:[NSString class]]) {
return (NSComparisonResult)NSOrderedAscending;
}
return NSOrderedSame;
}];
NSLog(@"Result: %@", result);
尝试以下代码:
NSArray *arr = @[@"A",@"B",@"Y",@"4 B",@"1 A",@"2 A",@"V",@"Z",@"10 B"];
NSArray *sortedArray;
sortedArray = [arr sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
int aa = [a intValue];
int bb = [b intValue];
if (aa !=0 && bb != 0)
{
return (aa > bb);
}
if (aa == 0 && bb == 0)
{
return [a compare:b];
}
if (aa == 0) return -1;
return 1;
}];
输出:( a,b,v,y,z,1 a,2 a,4 b,10 b)
您可以使用比较器进行排序,然后检查NSNUMBER或NSSTRING
来自Apple文档:
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
// check for instance here f.e. [obj1 isKindOfClass:[NSString class]]
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
尝试以下代码:
NSArray * arr =[[NSArray alloc]initWithObjects:@"01 Track1", @"02 Track2", @"33 Track3", @"Track1", @"Track2", @"Track3", @"07 ", nil];
NSArray *sortedTrack = [arr sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2)
{
return [obj1 compare:obj2];
}];
NSLog(@"%@",sortedTrack);
输出:(( " 01 Track1", " 02 Track2", " 07", " 33 Track3", Track1, track2, Track3)
我已经对此进行了测试。正常工作。用这个。但是对高效的怀疑。
NSArray *sortedArray = [yourArray sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 isKindOfClass:[NSString class]] && [obj2 isKindOfClass:[NSString class]] )
{
return [obj1 compare:obj2 options:NSCaseInsensitiveSearch];
}
else if ([obj1 isKindOfClass:[NSNumber class]] && [obj2 isKindOfClass:[NSNumber class]])
{
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
}
else
{
if ([obj1 isKindOfClass:[NSNumber class]])
return (NSComparisonResult)NSOrderedDescending;
if ([obj2 isKindOfClass:[NSNumber class]])
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
您可以使用nspredicate进行过滤。检查文档
NSArray *array = @[@"A", @1, @"Z", @"B", @10, @100, @"X"];
NSPredicate *numbersPredicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSNumber class]];
NSPredicate *stringsPredicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSString class]];
NSArray *numbersArray = [[array filteredArrayUsingPredicate:numbersPredicate] sortedArrayUsingSelector:@selector(compare:)];
NSArray *stringsArray = [[array filteredArrayUsingPredicate:stringsPredicate] sortedArrayUsingSelector:@selector(compare:)];
NSArray *sortedArray = [stringsArray arrayByAddingObjectsFromArray:numbersArray];
NSLog(@"sortedArray = %@", sortedArray);
结果;
sortedNumbers = (A, B, X, Z, 1, 10, 100)
这是一个非常简短的版本,利用了Objective-C的动态绑定,并且NSNumber
和NSString
都响应doubleValue
和description
:
NSArray *array = @[ @"A", @"B", @1, @2, @"V", @"Z", @10 ];
NSArray *result = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
NSComparisonResult result = [@([obj1 doubleValue]) compare:@([obj2 doubleValue])];
if (result != NSOrderedSame)
return result;
return [[obj1 description] compare:[obj2 description]];
}];
首先,我们将NSNumber
和NSString
同时转换为加倍,盒装并进行比较。非数字字符串将始终返回0,因此它们比较相等。
因此,如果数值比较的产量相等,我们只是进行正常的字符串比较,确保两个操作数都是字符串。
(这将负数放在非数字元素之前。)
NSArray *value_array = @[ @"A", @"B", @"1", @"2", @"V",@"Z",@"10"];
NSArray *result_array = [value_array sortedArrayUsingDescriptors:
@[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
ascending:YES]]];
NSLog(@"Sorted Array: %@", result_array);