我有2个nsarrays 1表示nsdictionary,另一个表示nsnumbers
NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}];
NSArray *arr2 = @[@3,@1,@4,@2];
我希望按照arr2的顺序对我的arr1进行排序 这有可能吗?
答案 0 :(得分:5)
使用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
中排除。这些是您必须根据您的要求解决的风险。
答案 1 :(得分:3)
以下是使用自定义比较器的方法:
NSArray* sorted= [arr1 sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
return [arr2 indexOfObject:obj1[@"id"]] - [arr2 indexOfObject:[obj2[@"id"]];
}];
我利用了这样一个事实:NSComparisonResult有+1表示升序,-1表示降序,0表示相同的顺序。
答案 2 :(得分: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;
}