鉴于有两个A和B类。
他们都得到一个整数属性,ID。
现在你有一个arrayA
,其中包含一个对象和一个包含所有B对象类的arrayB
。
选择arrayB
中与arrayA
中的对象具有相同ID的对象的最佳或更干净的方法是什么?
(有人建议交集。我认为这符合得更快,但代码看起来不太好)
以下是示例代码:
NSMutableArray *resultArray = [NSMutableArray array];
for (ClassB *bObject in arrayB) {
for (ClassA *aObject in arrayA) {
if ([bObject ID] == [aObject ID]) {
[resultArray addObject:bObject];
break;
}
}
}
答案 0 :(得分:2)
您当前的解决方案具有复杂度O(nm)
,其中n
和m
分别是A
和B
的长度。
您可以按A
中的ID对数组O(n log n)
进行排序,然后对B
中的每个元素,binary search A
中的ID进行排序。这将是O(n log n + m log n)
。 n log n
由于排序和m log n
,因为对于m
的每个B
元素,您在A
上执行一次二进制搜索,以对数运行时间。
你还可以将A
中的每个元素(实际只有它的ID)添加到hash table(可能用您选择的语言称为地图或字典。我不熟悉使用objective-c。)然后,对于B
的每个元素,在您构建的哈希表中查找其ID。这将是O(n + m)
,但在某些情况下它可能会退化到更复杂的程度。但在实践中,这可能是最快的。
答案 1 :(得分:0)
最简单的方法是(a)构建一个ID值数组;然后(b)使用谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID IN %@", [arrayA valueForKey:@"ID"]];
NSArray *results = [arrayB filteredArrayUsingPredicate:predicate];