3

私はとを持っていNSMutableArrayますNSArrayNSDictionarysどちらもそれ自体が要素で構成されています。両方のサンプル構造は次のとおりです。

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

私が欲しいのは、これら2つの配列をマージして、の要素がの要素と同じである場合にNSArray、の要素がの要素を上書きするようにすることです。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をキーとしてNSDictionary使用して最初の配列からオブジェクトを入力objectIdし、2 番目の配列を調べて上書きし、最後に値を取得することができます。結果NSMutableDictionaryを最終出力に変換します。

このアプローチは、配列が比較的長い (1000 以上の項目) 場合にのみ役立つことに注意してください10..100 個のアイテムを処理する場合、私は気にせず、あなたが提案したように 2 つのネストされたループをコーディングします。

于 2012-04-05T14:52:53.003 に答える
1

配列とマージの両方を反復することをお勧めしますが、最初に並べ替えます。並べ替えが完了すると、2 つの配列を O(N) 時間でマージできます。ほとんどの場合、これは可能な限り高速であり、必要なコードはほとんどありません。

それらが大きすぎて並べ替えがボトルネックになる場合は、次を使用して工夫することができますNSSet: 最初にオーバーライド配列 (の要素) をセットに入れ、次に元の配列の要素を追加します。ただし、要素に isEqual メソッドを実装する必要があります。この場合、要素が ではなく、オブジェクト ID フィールドを比較する isEqual メソッドをNSDictionary継承して実装するクラスになることを意味します。NSDictionary

NSSet償却された一定時間のアクセスを提供するため、並べ替えフェーズがないため、配列が大きい場合は高速になります。

于 2012-04-05T14:54:41.687 に答える