基于一组超级有序字符串对NSStrings的NSArray进行排序

时间:2013-01-22 12:13:14

标签: ios objective-c sorting nsstring nsarray

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

2 个答案:

答案 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指定的顺序剔除两个数组中存在的对象。