2012-04-05 73 views
3

我有一个NSMutableArray和一个NSArray。两者都由NSDictionarys本身组成。 两个样本结构如下:根据字典中的参数合并两个由字典组成的NSArrays

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任一元素的任何元素相同objectIdNSMutableArray中,NSArray中的元素应覆盖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]]; 
    } 
+0

#9035在您的合并数组中出现两次。那是故意的吗? – 2012-04-05 14:48:03

+0

不.. ..!我将编辑问题。感谢您指出 – chatur 2012-04-05 14:52:48

回答

2

由于您objectId值可以作为一个独特的密钥,你可能建立在侧NSMutableDictionary,使用objectId值作为关键字从第一个数组中填充NSDictionary对象,通过第二个数组,执行覆盖,最后收集合成的NSMutableDictionary的值到您的最终产出。

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

+0

非常感谢。我按照你的建议合并了阵列。 – chatur 2012-04-06 07:10:22

1

我会建议迭代通过数组和合并,但首先排序它们。一旦排序,您可以在O(N)时间内合并两个数组。对于大多数目的来说,这个速度可以尽可能快地获得,而且它只需要很少的代码。

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

因为NSSet给出了分摊的恒定时间访问,所以如果数组很大,这会更快,因为没有分类阶段。