【问题标题】:Most efficient way to find out if an object is already in an NSMutableArray?找出对象是否已经在 NSMutableArray 中的最有效方法?
【发布时间】:2011-04-28 11:05:39
【问题描述】:

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

所以我可以使用:

- (BOOL)containsObject:(id)anObj

但它会向数组中的每个对象发送 -isEqual。当有数千个时很糟糕。

还有:

- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject

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

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

【问题讨论】:

    标签: iphone objective-c nsmutablearray


    【解决方案1】:

    如果你真的经常需要,可以按类别创建实例方法:

    @interface NSArray (MONStuff)
    - (BOOL)mon_containsObject:(id)object;
    @end
    
    
    @implementation NSArray (MONStuff)
    
    - (BOOL)mon_containsObject:(id)object {
      return NSNotFound != [self indexOfObjectIdenticalTo:arg];
    }
    
    @end
    

    或者这些也是CFArrayContainsValue

    一个简单的函数也足够了。

    【讨论】:

    • 对界面进行了很好的简化。但是,我将其命名为 mon_containsObjectIdenticalTo: 以镜像 indexOfObject: indexOfObjectIdenticalTo: pair。
    【解决方案2】:

    但使用起来有点讨厌

    为什么?在我看来,

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

    并不比

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

    您选择哪一个取决于您使用的相等语义。您几乎肯定希望将-containsObject: 用于包含NSStrings 或NSNumbers 的数组,因为-isEqual: 提供了正确的相等语义。

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

    【讨论】:

    • 就像您可以看到自己一样,第二个要短得多,说明也少。所以是的,与 NSNotFound 相比有点讨厌:=)
    • +1 表示 O(n) 的事情。是的,这很糟糕。利用字典强大的散列函数是一个好主意。谢谢。
    【解决方案3】:

    根据您的解释和比较,indexOfObjectIdenticalTo 似乎是我使用的首选..

    这里还有一篇 SO 帖子 ..

    indexOfObject vs. indexOfObjectIdenticalTo

    【讨论】:

      【解决方案4】:

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

      另请参阅 Matt Gallagher 出色的 NSArray or NSSet, NSDictionary or NSMapTable 分析。

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 1970-01-01
        • 2017-02-24
        • 2019-06-24
        • 2013-11-07
        • 1970-01-01
        • 2014-12-04
        • 2010-10-08
        • 1970-01-01
        相关资源
        最近更新 更多