2012-04-05 62 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給出了分攤的恆定時間訪問,所以如果數組很大,這會更快,因爲沒有分類階段。