根据字典中的参数合并两个由字典组成的NSArray

时间:2012-04-05 14:44:18

标签: objective-c merge nsmutablearray filtering

我有NSMutableArrayNSArray。两者都由NSDictionarys本身的元素组成。 两者的样本结构如下:

NSMutableArray
[
    {
        objectId = 4274;
        name = orange;
        price = 45;
        status = approved;
    },
        {
        objectId = 9035;
        name = apple;
        price = 56;
        status = approved;
    },
        {
        objectId = 7336;
        name = banana;
        price = 48;
        status = approved;
    }
    .
    .
    .
    .
]

和NSAraay是

NSArray
[
    {
        objectId = 4274;
        name = orange;
        price = 106;
        status = not_approved;
    },
        {
        objectId = 5503;
        name = apple;
        price = 56;
        status = approved;
    }
]

我想要合并这两个数组,以便NSArray中的任何元素与objectId中的任何元素具有相同的NSMutableArrayNSArray中的元素应该覆盖on NSMutableArray中的元素。

所以在这种情况下,最终合并的数组应该看起来像这样

MergedArray
    [
        {
            objectId = 4274;
            name = orange;
            price = 106;
            status = not_approved;
        },
            {
            objectId = 9035;
            name = apple;
            price = 56;
            status = approved;
        },
            {
            objectId = 7336;
            name = banana;
            price = 48;
            status = approved;
        },
           {
            objectId = 5503;
            name = apple;
            price = 56;
            status = approved;
        }
        .
        .
        .
        .
    ]

我知道的唯一方法是迭代两个数组并合并。有没有更好的方法?任何帮助将不胜感激。

修改

按照dasblinkenlights的建议,我按照以下方式做了

    -(NSMutableArray*)mergeTwoArray:(NSArray*)array1 :(NSArray*)array2
    {
//array1 will overwrite on array2
    NSSet* parentSet = [NSSet setWithArray:array2];

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        for (NSDictionary *item in parentSet) 
           [dict setObject: item forKey: [item objectForKey:@"objectId"]];


        NSLog(@"initial dictionary is %@",dict);
        for (NSDictionary *item in array1)            
            [dict setObject: item forKey: [item objectForKey:@"objectId"]];

        NSLog(@"final dictionary is %@ with all values %@", dict,[dict allValues]);

        return [NSMutableArray arrayWithArray:[dict allValues]];
    }

2 个答案:

答案 0 :(得分:2)

由于您的objectId值可以用作唯一键,因此您可以在侧面创建NSMutableDictionary,使用{{1来填充第一个数组中的NSDictionary个对象将value作为键,遍历第二个数组,执行覆盖,最后将结果objectId的值收集到最终输出中。

请注意,只有当您的阵列相对较长(1000多个项目)时,此方法可能才有用。如果您处理10..100项,我不会打扰,并按照您的建议编写两个嵌套循环。

答案 1 :(得分:1)

我建议迭代两个数组并合并,但首先对它们进行排序。排序后,您可以在O(N)时间内合并两个数组。在大多数情况下,这个速度与您可以获得的速度一样快,而且只需要很少的代码。

如果它们足够大以至于排序是一个瓶颈,那么你可以使用NSSet来表达:首先将(元素)覆盖数组置于集合中,然后添加元素原始数组。但是你必须为你的元素实现一个isEqual方法。在这种情况下,这意味着您的元素将不再是NSDictionary,而是一个继承自NSDictionary的类,但实现了isEqual方法来比较对象ID字段。

因为NSSet给出了分摊的常量时间访问,如果数组很大,这会更快,因为没有排序阶段。