我有NSArray
,其中包含一些NSString
个对象。例如:
NSArray *objects = @[@"Stin",@"Foo",@"Ray",@"Space"];
现在我需要根据字符串的顺序对此数组进行排序。
NSArray *sortOrder = @[@"John",@"Foo",@"Space",@"Star",@"Ray",@"Stin"];
所以答案应该是
NSArray *sorted = @[@"Foo",@"Space",@"Ray",@"Stin"];
我怎样才能做到这一点?
解答: 根据dasblinkenlight的接受答案,我做了以下工作,并且它很有魅力。
NSMutableArray *objects = @[@"Star",@"Stin",@"Foo",@"Ray",@"Space",@"John"];
NSArray *sortOrder = @[@"John",@"Foo",@"Space",@"Star",@"Ray",@"Stin"];
[objects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
int index1 = [sortOrder indexOfObject:obj1];
int index2 = [sortOrder indexOfObject:obj2];
if (index1 > index2)
return NSOrderedDescending;
if (index1 < index2)
return NSOrderedAscending;
return NSOrderedSame;
}];
答案 0 :(得分:6)
创建NSComparator
,其中包含对超集数组的引用,并通过比较两个字符串上调用[superset indexOfObject:str]
的结果来确定字符串的相对顺序。调用sortedArrayUsingComparator:
传递NSComparator
的实例以获得所需的排序。
答案 1 :(得分:3)
dasblinkenlight的解决方案可行,但与大多数编程问题一样,有多种方法可以实现。这是一个这样的选择:
NSMutableArray *sorted = [NSMutableArray arrayWithCapacity:0];
[sortOrder enumerateObjectsUsingBlock:^(NSString *sortedString, NSUInteger idx, BOOL *stop) {
if ([objects containsObject:sortedString]) {
[sorted addObject:sortedString];
}
}];
变量名对应于原始问题中使用的变量名。
这是有效的,因为枚举按顺序发生。因此,发生的事情本质上是按照sortOrder
指定的顺序剔除两个数组中存在的对象。