6

我有一个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;
}];
4

2 回答 2

6

CreateNSComparator持有对超集数组的引用,并通过比较[superset indexOfObject:str]两个字符串的调用结果来确定字符串的相对顺序。调用sortedArrayUsingComparator:传递一个实例NSComparator以获得所需的排序。

于 2013-01-22T12:24:44.510 回答
3

dasblinkenlight 的解决方案会起作用,但像大多数编程问题一样,有多种方法可以解决它。这是一种这样的选择:

NSMutableArray *sorted = [NSMutableArray arrayWithCapacity:0];

[sortOrder enumerateObjectsUsingBlock:^(NSString *sortedString, NSUInteger idx, BOOL *stop) {
    if ([objects containsObject:sortedString]) {
        [sorted addObject:sortedString];
    }
}];

变量名称对应于原始问题中使用的变量名称。

这是有效的,因为枚举是按顺序发生的。因此,本质上,发生的事情是按照 指定的顺序对两个数组中存在的对象进行剔除sortOrder

于 2013-01-22T12:37:56.200 回答