ios - 将一个 NSArray 按另一个带有 id 的 nsarray 排序

标签 ios objective-c sorting nsarray

我有 2 个 nsarray 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 之外。这些是您必须根据您的要求解决的风险。

关于ios - 将一个 NSArray 按另一个带有 id 的 nsarray 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012301/

相关文章:

ios - 在模拟等待时关闭键盘

objective-c - 如何从另一个字符串替换 NSMutableString 中出现的字符串

python - 在 python 中,我将如何对字符串比较位置发生变化的字符串列表进行排序?

ios - 静态变量为零 - Objective C

ios - 如何指定 NSPredicate 来匹配不以字母开头的字符串?

ios - tableView imageView 内容模式不起作用?

c++ - 对 vector <vectors< double>> 进行排序并删除重复项

ios - 获取 View 被关闭时的时刻

ios - 向 UIView 添加多个 subview

c# - MongoDB 文本搜索,在 C# 中进行排序