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)
注意:代码未经测试,直接输入.
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |