ObjC:查找集合中是否存在数字

时间:2014-01-16 09:05:19

标签: objective-c nsarray nsnumber nsset

我有一个长值列表:

300210, 300211, 310210, 310211, ...

我正在寻找检查集合中是否存在数字的最佳方法。该集合是不可变的,这种检查可能每秒发生数百次(这是物理引擎冲突预测的一部分)。

如果使用NSArray,我将使用NSNumbers。这些是对象 - containsObject:方法是否使用哈希码?或者它是否始终使用值比较(而不是指针地址)?

NSSet怎么样?我知道它有一个成员:使用isEqual的方法:但没有实际经验。

感谢您的帮助,找到解决此问题的最佳方法。

3 个答案:

答案 0 :(得分:2)

使用NSArray,如果数组包含NSNumber,那么您可以使用containsObject: 因为它们与不是指针的值相匹配。

NSNumber *num3 = [NSNumber numberWithInteger:3];
NSArray *array = @[@1, @2, num3, @4, @5];

BOOL isExists = [array containsObject:@3]; // yes

同样使用NSSet,您可以采取类似的方式:

NSSet *set = [NSSet setWithArray:array];

BOOL isExists = [set containsObject:@3];

答案 1 :(得分:2)

我建议启用objective-C ++并使用std :: set。它比NSSet快得多。 你需要:

标题中的

#include <set>
using namespace std;

代码:

set<int> numberCollection;

答案 2 :(得分:1)

您可以在objc.ico阅读一篇关于Objective-C集合及其表现的精彩文章。

在您的情况下(检查集合是否包含给定对象),NSSet绝对是最佳选择。

  

NSSet及其可变变体NSMutableSet是无序的对象集合。检查是否存在通常是O(1)操作,这使得这个用例比NSArray快得多。