2

我有 2 个 nsarrays 1 个带有 nsdictionary 的另一个带有 nsnumbers

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

我想按照 arr2 的顺序通过他们的 id 对我的 arr1 进行排序,这可能吗?

4

3 回答 3

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. 这些是您必须根据您的要求解决的风险。

于 2013-09-25T18:35:32.293 回答
3

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

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

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

于 2013-09-25T18:26:51.313 回答
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;
}
于 2013-09-25T18:46:18.600 回答