3

我有一个NSMutableArray和一个NSArray。两者都由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;
    }
]

我想要的是合并这两个数组,这样,如果 in 中的任何元素与 in中的任何元素NSArray相同,则 element in应该覆盖在 element in 上。objectIdNSMutableArrayNSArrayNSMutableArray

所以在这种情况下,最终合并的数组应该是这样的

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]];
    }
4

2 回答 2

2

由于您的objectId值可以用作唯一键,因此您可能会在旁边创建一个,使用第一个数组中的对象NSMutableDictionary填充它,使用值作为键,遍历第二个数组,进行覆盖,最后收获结果进入您的最终输出。NSDictionaryobjectIdNSMutableDictionary

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

于 2012-04-05T14:52:53.003 回答
1

我建议遍历两个数组并合并,但首先对它们进行排序。排序后,您可以在 O(N) 时间内合并两个数组。对于大多数目的,这几乎是您能获得的最快速度,并且只需要很少的代码。

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

因为NSSet提供了摊销的常数时间访问,所以如果数组很大,这会更快,因为没有排序阶段。

于 2012-04-05T14:54:41.687 回答