用另一个带有id的nsarray对NSArray进行排序

时间:2013-09-25 18:18:20

标签: ios objective-c sorting nsarray

我有2个nsarrays 1表示nsdictionary,另一个表示nsnumbers

NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];

我希望按照arr2的顺序对我的arr1进行排序 这有可能吗?

3 个答案:

答案 0 :(得分:5)

使用sortedArrayUsingComparator:的问题是您开始处理O(n^2)查找时间。对于第一个数组中的每个排序比较,您必须在第二个数组中进行查找。

最好的办法是利用哈希表将其降低到O(n)平均复杂度。

您的第一步是使用id作为密钥创建字典。结果看起来像@{@1: @{@"id":@"1"}, ...}。然后你只需要通过循环arr3并抓取值来构造一个数组。

NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];

NSMutableDictionary *map = [NSMutableDictionary dictionary];
for (NSDictionary *item in arr1) {
    map[item[@"id"]] = item;
}

NSMutableArray *arr3 = [NSMutableArray array];
for (id key in arr2) {
    [arr3 addObject:map[key]];
}

该解决方案当然假设两个阵列之间存在奇偶校验。如果arr2的元素不在arr1,则在尝试将nil添加到arr3时会崩溃。如果arr1的值不在arr2,则会从arr3中排除。这些是您必须根据您的要求解决的风险。

答案 1 :(得分:3)

以下是使用自定义比较器的方法:

NSArray* sorted= [arr1 sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
    return [arr2 indexOfObject:obj1[@"id"]] - [arr2 indexOfObject:[obj2[@"id"]];
}];

我利用了这样一个事实:NSComparisonResult有+1表示升序,-1表示降序,0表示相同的顺序。

答案 2 :(得分:1)

- (NSArray*) sortedArray
{
    NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
    NSArray *arr2 = @[@3,@1,@4,@2];

    NSMutableArray *mutableArray = [NSMutableArray new];
    for (NSNumber *number in arr2)
    {
        for (NSDictionary* dictionary in arr1)
        {
            NSNumber *number2 = dictionary[@"id"];
            if ([number isEqual:number2])
            {
                [mutableArray addObject:dictionary];
                break;
            }
        }
    }
    return mutableArray;
}