Objective c 对非基于字符串的字符串数组进行排序

Objective c 对非基于字符串的字符串数组进行排序,objective-c,ios,cocoa-touch,sorting,nsarray,Objective C,Ios,Cocoa Touch,Sorting,Nsarray,因此,我有一个数组,我从web服务中检索它时没有特定的顺序 例如: 0 => x large, 1 => large, 2 => XX large, 3 => small, 4 => medium, 5 => x small 我需要对它们进行排序:首先根据具体的-可能是逆字母顺序: small medium large 其次,我需要根据它们的“x”计数器部件对它们进行排序: x small small medium large x large xx

因此,我有一个数组,我从web服务中检索它时没有特定的顺序

例如:

0 => x large, 
1 => large, 
2 => XX large, 
3 => small,
4 => medium, 
5 => x small
我需要对它们进行排序:首先根据具体的-可能是逆字母顺序:

small
medium
large
其次,我需要根据它们的“x”计数器部件对它们进行排序:

x small
small
medium
large
x large
xx large

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

也许你可以对字符串进行排序,其中“xx s”被替换为“z”,“x s”被替换为“v”,而“x l”被替换为“b”,而“xx l”被替换为“a”。
q

首先,为了理智起见,在NSString中添加一个类别

@implementation NSString (NSStringContainsCategory)

- (BOOL)contains:(NSString*)string;
{
    if(IsEmpty(string)) {
        return NO;
    }

    NSRange range = [self rangeOfString:string options:NSCaseInsensitiveSearch];

    if (range.location != NSNotFound) {
        return YES;
    }

    return NO;
}

@end
那么

我不认为这很优雅,但这是我能想到的最简单的答案。您可能希望颠倒顺序以满足您的需要-只需对比较结果应用负数即可。如果这不起作用,请注释,我会再看一眼。

使用块语法。差不多

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

问题的第二项任务——分为小型、中型和大型——可以这样做:

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

}];

大=3,中=2,小=3?我认为它应该是3,2,1.+1,因为它很聪明,虽然我认为它不是最好的设计,如果将这个比较方法添加到每个NSString对象中,尽管它很可能只需要在一个特定的地方——解析服务器响应时使用。这太棒了,我想我只是打破了一个障碍,尽管我从未见过这种代码。我会破解它,让它在我的电脑上运行。这些代码使用块,苹果公司在iOS4上发布的一个附加代码。一定要了解他们,因为他们越来越重要,越来越受欢迎。i、 e.一些第三方网络框架使用它们。它们对于apple新的并发框架grand central dispatch非常重要。是的,这太棒了,我成功了。我的“大小”数组越来越大,我希望“大小”框不是一个开放的字段!
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;
}];
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];

}];