排序阵列第一个字符串而不是数字



我想排序包含字符串以及诸如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的动态绑定,并且NSNumberNSString都响应doubleValuedescription

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]];
}];

首先,我们将NSNumberNSString同时转换为加倍,盒装并进行比较。非数字字符串将始终返回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);

最新更新