对字符串的nsarray进行排序而不是基于字符串

mis*_*koz 5 sorting cocoa-touch objective-c nsarray ios

所以我有一个数组,我从Web服务检索没有特定的顺序

例:

0 => x large, 
1 => large, 
2 => XX large, 
3 => small,
4 => medium, 
5 => x small
Run Code Online (Sandbox Code Playgroud)

我需要对它们进行排序:首先根据具体情况 - 可能是反向字母:

small
medium
large
Run Code Online (Sandbox Code Playgroud)

其次,我需要根据他们的'x'计数器部分对它们进行排序:

x small
small
medium
large
x large
xx large
Run Code Online (Sandbox Code Playgroud)

我知道我可以用蛮力字符串匹配来做到这一点,但我真的想要一个关于如何整齐地做这个的建议,也许是一个正则表达式或更优雅的东西?

Vik*_*ica 10

使用NSComparator块语法.就像是

NSArray * sizes = [NSArray arrayWithObjects:  @"x small",@"small",@"medium",@"large",@"x large", nil];

NSArray *sortedBySizes =[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if ([sizes indexOfObject:[obj1 size]]> [sizes indexOfObject:[obj2 size]])
        return (NSComparisonResult)NSOrderedAscending;
    if ([sizes indexOfObject:[obj1 size]]< [sizes indexOfObject:[obj2 size]])
        return (NSComparisonResult)NSOrderedDescending;
    return (NSComparisonResult)NSOrderedSame;
}];
Run Code Online (Sandbox Code Playgroud)

在第二种方法中,我添加了Web服务器发送的数字与x-sized之间的映射.现在[obj size];假设返回一个NSNumber对象.

NSArray * sizesStrings = [NSArray arrayWithObjects:  @"x small",@"small",
                                                     @"medium",@"large",
                                                     @"x large",@"xx large", 
                                                     nil];
NSArray * sizesNumbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:5],
                                                   [NSNumber numberWithInt:3],
                                                   [NSNumber numberWithInt:4],
                                                   [NSNumber numberWithInt:1],
                                                   [NSNumber numberWithInt:0],
                                                   [NSNumber numberWithInt:2], 
                                                   nil];

NSDictionary *sizes = [NSDictionary dictionaryWithObjects:sizesStrings 
                                                   forKeys:sizesNumbers];

NSArray *sortedBySizes = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *sizeObj1String = [sizes objectForKey:[obj1 size]];
    NSString *sizeObj2String = [sizes objectForKey:[obj1 size]];

    int i1 = [sizesStrings indexOfObject:sizeObj1String];
    int i2 = [sizesStrings indexOfObject:sizeObj2String];

    if (i1 > i2)
        return (NSComparisonResult)NSOrderedAscending;
    if (i2 > i1)
        return (NSComparisonResult)NSOrderedDescending;
    return (NSComparisonResult)NSOrderedSame;
}];
Run Code Online (Sandbox Code Playgroud)

问题的第二个任务 - 分为小,中,大 - 可以这样做:

NSDictionary *groups = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSMutableArray array],[NSMutableArray array],[NSMutableArray array], nil] 
                                    forKeys:[NSArray arrayWithObjects:@"small",@"medium",@"large",nil]
                        ];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    int i = [[obj size] intValue];
    if (i == 5 || i == 3) 
        [[groups objectForKey:@"small"] addObject:obj];
    else if (i == 2 || i == 0 || i == 1)
        [[groups objectForKey:@"large"] addObject:obj];
    else
        [[groups objectForKey:@"medium"] addObject:obj];

}];
Run Code Online (Sandbox Code Playgroud)

注意:代码未经测试,直接输入.