2012-04-05 12 views
3

私はNSMutableArrayNSArrayを持っています。どちらも、NSDictionarysの要素で構成されています。次のように 両方のサンプル構造は次のとおりです。私が欲しいもの辞書のパラメータに基づいて辞書で構成される2つのNSArrayをマージする

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を持っている場合、そのように、これら二つの配列をマージすることですNSMutableArrayでは、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; 
     } 
     . 
     . 
     . 
     . 
    ] 

唯一の方法のようになります。もっと良い方法はありますか?どんな助けでも大歓迎です。

EDIT:dasblinkenlights提案後

あなたobjectId値が一意のキーとして使用することができますので、私はそれが道

-(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は、結合された配列で2回表示されます。それは意図的なのでしょうか? –

+0

No .. !!私は質問を編集します。 – chatur

答えて

2

を以下のなかった、あなたは潜在的に、側NSMutableDictionaryを作成することができますの値をキーに使用して、最初の配列のNSDictionaryオブジェクトを読み込み、2番目の配列を通過し、上書きを行い、最後に結果の値NSMutableDictionaryを取得しますr最終出力。

は、配列が比較的長い場合(1000以上のアイテム)にのみ役立つことに注意してください。あなたが10.00アイテムを扱うならば、私は心配しないで、あなたが示唆したように2つのネストされたループをコード化します。

+0

ありがとうたくさんありがとう。あなたが提案した方法で配列をマージしました。 – chatur

1

私は、配列とマージの両方を行うことをお勧めしますが、まずソートしてください。並べ替えが終わったら、2つの配列をO(N)時間でマージすることができます。ほとんどの目的のために、これはあなたが得ることができるほど速く、必要なコードはほとんどありません。

並べ替えがボトルネックとなるような大きさの場合は、NSSetを使用して気に入ってください。まず、オーバーライドした配列をセットに入れ、元の配列の要素を追加します。しかし、要素にisEqualメソッドを実装する必要があります。この場合、要素がNSDictionaryでなく、NSDictionaryから継承されますが、オブジェクトIDフィールドを比較するisEqualメソッドが実装されていることを意味します。

NSSetは、償却された一定時間のアクセスを提供するため、ソート段階がないので、配列が大きい場合、これは高速になります。

関連する問題