我有一个长值列表:
300210, 300211, 310210, 310211, ...
我正在寻找检查集合中是否存在数字的最佳方法。该集合是不可变的,这种检查可能每秒发生数百次(这是物理引擎冲突预测的一部分)。
如果使用NSArray,我将使用NSNumbers。这些是对象 - containsObject:方法是否使用哈希码?或者它是否始终使用值比较(而不是指针地址)?
NSSet怎么样?我知道它有一个成员:使用isEqual的方法:但没有实际经验。
感谢您的帮助,找到解决此问题的最佳方法。
答案 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快得多。