2

私は 2 つの nsarrays を持っています。1 つは nsdictionary のもので、もう 1 つは nsnumbers のものです

NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];

そして、arr2の順序に従って、arr1をIDでソートしたいのですが、これは可能ですか?

4

3 に答える 3

5

使用の問題は、ルックアップ時間のsortedArrayUsingComparator:処理を開始することです。O(n^2)最初の配列のソート比較ごとに、2 番目の配列でルックアップを行う必要があります。

あなたの最善の策は、ハッシュテーブルを利用してそれをO(n)平均的な複雑さに減らすことです.

最初のステップはid、 をキーとして使用して辞書を作成することです。結果は次のようになります@{@1: @{@"id":@"1"}, ...}。次にarr3、値をループして取得することにより、配列を構築するだけです。

NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];

NSMutableDictionary *map = [NSMutableDictionary dictionary];
for (NSDictionary *item in arr1) {
    map[item[@"id"]] = item;
}

NSMutableArray *arr3 = [NSMutableArray array];
for (id key in arr2) {
    [arr3 addObject:map[key]];
}

もちろん、このソリューションは 2 つのアレイ間のパリティを前提としています。arr2要素が含まれていない場合arr1、 に追加しようとするとクラッシュnilarr3ます。arr1に値がない場合は、arr2から除外されarr3ます。これらは、要件に基づいて対処する必要があるリスクです。

于 2013-09-25T18:35:32.293 に答える
3

カスタムコンパレータを使用してそれを行う方法は次のとおりです。

NSArray* sorted= [arr1 sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
    return [arr2 indexOfObject:obj1[@"id"]] - [arr2 indexOfObject:[obj2[@"id"]];
}];

NSComparisonResultが昇順を表すには +1、降順を表すには -1、同じ順序を表すには 0 があるという事実を利用しました。

于 2013-09-25T18:26:51.313 に答える
1
- (NSArray*) sortedArray
{
    NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
    NSArray *arr2 = @[@3,@1,@4,@2];

    NSMutableArray *mutableArray = [NSMutableArray new];
    for (NSNumber *number in arr2)
    {
        for (NSDictionary* dictionary in arr1)
        {
            NSNumber *number2 = dictionary[@"id"];
            if ([number isEqual:number2])
            {
                [mutableArray addObject:dictionary];
                break;
            }
        }
    }
    return mutableArray;
}
于 2013-09-25T18:46:18.600 に答える