找出对象是否已存在于NSMutableArray中的最有效方法?

时间:2011-04-28 11:05:40

标签: iphone objective-c nsmutablearray

我只是想知道对象是否在数组中。

所以我可以使用:

- (BOOL)containsObject:(id)anObj

但它会将-isEqual发送给数组中的每个对象。当有成千上万的时候很糟糕。

然后有:

- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject

似乎只比较内存地址。我认为这更快。但是当然有点讨厌使用。人们必须检查NSNotFound。

-indexOfObjectIdenticalTo真的是最好的选择吗?

4 个答案:

答案 0 :(得分:2)

  

但使用

有点讨厌

为什么呢?在我看来

if ([array indexOfObjectIdenticalTo: foo] != NSNotFound)
{
    // do what you need
}

并不比

更讨厌
if ([array containsObject: foo])
{
    // do what you need
}

您选择哪一个取决于您使用的等同语义。您几乎肯定希望对包含-containsObject:NSString的数组使用NSNumber,因为-isEqual:给出了正确的相等语义。

顺便提一下,这两种方法都是 O(n),这是真正的性能问题所在。如果线性搜索的想法是一个问题,请考虑不同的数据结构,例如基于NSDictionary。

答案 1 :(得分:2)

如果您经常需要这个,可以按类别创建实例方法:

@interface NSArray (MONStuff)
- (BOOL)mon_containsObject:(id)object;
@end


@implementation NSArray (MONStuff)

- (BOOL)mon_containsObject:(id)object {
  return NSNotFound != [self indexOfObjectIdenticalTo:arg];
}

@end

或者这些也是CFArrayContainsValue

一个简单的功能也足够了。

答案 2 :(得分:1)

根据您的解释和比较indexOfObjectIdenticalTo似乎我是第一个使用..

这是另一个SO帖子..

indexOfObject vs. indexOfObjectIdenticalTo

答案 3 :(得分:1)

如果可能(例如,如果排序顺序无关紧要),您可以改为使用NSDictionary,将对象作为键{和值[NSNull null]。请注意,用作键时会复制对象!您的对象需要实现- (NSUInteger)hash方法。

另见Matt Gallagher的优秀NSArray or NSSet, NSDictionary or NSMapTable分析。