如何在iOS中对大小字符串的NSArray进行排序?

时间:2014-05-05 08:36:58

标签: ios objective-c sorting nsarray

有一个NSSet包含产品的一些大小字符串。我正在尝试使用NSSortDescriptor对数组进行排序。因为它按字母顺序排序,结果并不完全正确。

代码段如下:

NSSet *set = [[NSSet alloc] initWithObjects:@"40", @"30", @"31", @"3XL", @"44", @"46", @"50", @"52", @"54", @"56", @"48", @"33", @"L", @"M", @"S", @"XL", @"XS", @"XXS",@"XXL",nil];
NSArray *sizeArray = [set allObjects];
NSSortDescriptor *sizeSort = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending: YES];
NSArray *sortedArray = [sizeArray sortedArrayUsingDescriptors:@[sizeSort]];

NSLog(@"Set: %@ \n Sorted: %@", set, sortedArray);

输出如下:

设置:{(     46,     52,     XL,     XXS,     54,     48,     33,     44,     50,     L,     40,     男,     S,     30,     56,     XS,     XXL,     3XL,     31 )}  排序:(     30,     31,     33,     3XL,     40,     44,     46,     48,     50,     52,     54,     56,     L,     男,     S,     XL,     XS,     XXL,     XXS )

理想的结果应该是(30,31,33,40,44,46,48,50,52,54,56,XXS,XS,S,M,L,XL,XXL,3XL)

有没有更好的方式来排序?

2 个答案:

答案 0 :(得分:4)

NSSet *set = [[NSSet alloc] initWithObjects:@"40", @"30", @"31", @"3XL", @"44", @"46", @"50", @"52", @"54", @"56", @"48", @"33", @"L", @"M", @"S", @"XL", @"XS", @"XXS",@"XXL",nil];
NSArray *sizeArray = [set allObjects];

    NSArray *sizes = @[@"XXS", @"XS", @"S", @"M", @"L", @"XL", @"XXL", @"3XL"];
    NSArray *sortedArray = [sizeArray sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
        NSUInteger index1 = [sizes indexOfObject:obj1];
        NSUInteger index2 = [sizes indexOfObject:obj2];
        if (index1 == NSNotFound && index2 == NSNotFound) {
            return [@([obj1 intValue]) compare:@([obj2 intValue])];
        }
        else if (index1 == NSNotFound)
        {
            return NSOrderedAscending;
        }
        else if (index2 == NSNotFound)
        {
            return NSOrderedDescending;
        }
            return [@(index1) compare:@(index2)];
    }];

NSLog(@"Set: %@ \n Sorted: %@", set, sortedArray);

输出:

Set: ( 46, 52, XL, XXS, 54, 48, 33, 44, 50, L, 40, M, S, 30, 56, XS, XXL, 3XL, 31 )
Sorted: (30, 31, 33, 40, 44, 46, 48, 50, 52, 54, 56, XXS, XS, S, M, L, XL, XXL, 3XL )

答案 1 :(得分:1)

更新了答案......

NSSet *set = [[NSSet alloc] initWithObjects:@"40", @"30", @"31", @"3XL", @"44", @"46", @"50", @"52", @"54", @"56", @"48", @"33", @"L", @"M", @"S", @"XL", @"XS", @"XXS",@"XXL",nil];
NSArray *sizeArray = [set allObjects];

NSMutableArray *numberArray, *charArray;
numberArray = [NSMutableArray array];
charArray = [NSMutableArray array];

BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet; 

for (int i = 0 ; i < [sizeArray count]; i++)
{
    inStringSet = [NSCharacterSet characterSetWithCharactersInString:[sizeArray objectAtIndex:i]];
    valid = [alphaNums isSupersetOfSet:inStringSet];    

    if (valid)
        [numberArray addObject:[sizeArray objectAtIndex:i]];
    else
        [charArray addObject:[sizeArray objectAtIndex:i]];
}



NSSortDescriptor *sizeSort = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending: YES];
NSSortDescriptor *sizeSort1 = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending: NO];

NSArray *sortedArray1 = [numberArray sortedArrayUsingDescriptors:@[sizeSort]];
NSArray *sortedArray2 = [charArray sortedArrayUsingDescriptors:@[sizeSort1]]; // sort in descending order.

NSMutableArray *fullSortedArray = [NSMutableArray array];

[fullSortedArray addObjectsFromArray:sortedArray1];
[fullSortedArray addObjectsFromArray:sortedArray2];

    NSLog(@"Set = %@ \n Sorted = %@", set, fullSortedArray);

你好看看这个

<强>输出:

Set = {(     46,     52,     XL,     XXS,     54,     48,     33,     44,     50,     L,     40,     男,     S,     30,     56,     XS,     XXL,     3XL,     31 )}  排序=(     30,     31,     33,     40,     44,     46,     48,     50,     52,     54,     56,     3XL,     L,     男,     S,     XL,     XS,     XXL,     XXS )