我有 2 个 nsarrays 1 个带有 nsdictionary 的另一个带有 nsnumbers
NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];
我想按照 arr2 的顺序通过他们的 id 对我的 arr1 进行排序,这可能吗?
我有 2 个 nsarrays 1 个带有 nsdictionary 的另一个带有 nsnumbers
NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];
我想按照 arr2 的顺序通过他们的 id 对我的 arr1 进行排序,这可能吗?
使用的问题sortedArrayUsingComparator:
是您开始处理O(n^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]];
}
这个解决方案当然假设两个数组之间的奇偶性。如果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;
}