检查NSArray是否包含具有特定属性的对象

10

我有一个UIView数组。我想检查该数组是否包含具有特定标签的UIView。如果是,则应获取该视图,否则应收到nil。

目前我正在使用以下方法

// validCells is an array UIView

NSPredicate *p = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *ignored){
            return ((UIView *)obj).tag == i;
        }];

UIView *cell = [[validCells filteredArrayUsingPredicate:p] lastObject]; 

这个方法可以正常工作,但复杂度为n^2。我想知道是否有其他更好的方法。

谢谢。


4
您是否需要使用谓词?您只需枚举即可在O(n)的时间内完成。此外,这真的太慢了吗?您可能会有多少次浏览? - jscs
1
为什么复杂度是n^2? - ilya n.
3
你认为复杂度为O(n^2)的原因是什么? - Martin R
2
C. A. R. Hoare: “过早的优化是编程中一切罪恶的根源。” - zaph
2
@Sumit,你的方法很好,Martin的也不错。从我的角度来看,我会选择最直观的那个,为人类读者而写,而不是为编译器而写。 - zaph
显示剩余2条评论
1个回答

25

我认为你的方法的复杂度不是O(n^2),更可能是O(n)。但是,如果你只是搜索特定元素,就没有必要创建临时数组。正如@Josh所说,可以进行简单的枚举。

如果你想再花点心思,你可以这样写:

NSUInteger index = [validCells indexOfObjectPassingTest:^BOOL(UIView *view, NSUInteger idx, BOOL *stop) {
    return view.tag == idx;
}];
if (index != NSNotFound) {
    cell = validCells[index];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接