对不是string的stringsorting

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

例:

0 => x large, 1 => large, 2 => XX large, 3 => small, 4 => medium, 5 => x small 

我需要对它们进行sorting:首先基于具体的 – 这可能是反向字母:

 small medium large 

其次,我需要根据他们的“x”柜台部分对它们进行sorting:

 x small small medium large x large xx large 

我知道我可以用powershellstring匹配来做到这一点,但我真的很想有一个build议,如何做到这一点,也许正则expression式或更优雅的东西?

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

在第二种方法中,我添加了由Web服务器发送的数字和x大小之间的映射。 现在[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; }]; 

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

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

:代码未经testing,直接input。

首先,为了理智,将一个类别添加到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 

然后,

 NSMutableArray* sortMe = [NSMutableArray arrayWithArray:theArrayYouWantToSort]; NSComparator smlComparator = ^NSComparisonResult(id string1, id string2) { // 1 = small, 2 = medium, 3 = large NSNumber* string1Number = [NSNumber numberWithInt:0]; NSNumber* string2Number = [NSNumber numberWithInt:0]; if([string1 contains:@"large"]) { string1Number = [NSNumber numberWithInt:3]; } else if([string1 contains:@"medium"]) { string1Number = [NSNumber numberWithInt:2]; } else if([string1 contains:@"small"]) { string1Number = [NSNumber numberWithInt:1]; } if([string2 contains:@"large"]) { string2Number = [NSNumber numberWithInt:3]; } else if([string2 contains:@"medium"]) { string2Number = [NSNumber numberWithInt:2]; } else if([string2 contains:@"small"]) { string2Number = [NSNumber numberWithInt:1]; } NSComparisonResult compareSml = [string1Number compare:string2Number]; if(compareSml == 0) { // if they are the same size, just use normal string comparison to sort x xx xxx etc return [string1 compare:string2]; } return compareSml; }; [sortMe sortUsingComparator:smlComparator]; 

我不会称之为优雅,但这是我能想到的最简单的答案。 您可能想要颠倒顺序以适合您的需求 – 只需将负值应用于比较结果即可。 如果这不起作用,我会再看看。

也许你可以把“xx s”replace为“z”,“xs”replace为“v”,“xl”replace为“b”,“xx l”replace为“a”来sortingstring。 q