私は 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でソートしたいのですが、これは可能ですか?
私は 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でソートしたいのですが、これは可能ですか?
使用の問題は、ルックアップ時間の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
、 に追加しようとするとクラッシュnil
しarr3
ます。arr1
に値がない場合は、arr2
から除外されarr3
ます。これらは、要件に基づいて対処する必要があるリスクです。
カスタムコンパレータを使用してそれを行う方法は次のとおりです。
NSArray* sorted= [arr1 sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
return [arr2 indexOfObject:obj1[@"id"]] - [arr2 indexOfObject:[obj2[@"id"]];
}];
NSComparisonResultが昇順を表すには +1、降順を表すには -1、同じ順序を表すには 0 があるという事実を利用しました。
- (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;
}