寻找更简洁的方法来执行此搜索功能

时间:2015-08-05 14:18:51

标签: ios objective-c algorithm cocoa-touch

鉴于有两个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;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您当前的解决方案具有复杂度O(nm),其中nm分别是AB的长度。

您可以按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];

请参阅Predicate Programming Guide