我有NSMutableArray
的NSNumbers
。基本上我只想检查数组中的任何NSNumbers
是否为某个值。
我可以遍历数组,逐个检查,这绝不是最佳选择。
我也尝试过使用containsObject
失败了,因为这只有在id相同时才有效。
我读了一些关于NSPredicate
的东西,这似乎是一个很好的解决方案,但我不确定如何使用它与NSArray
。
任何答案都表示赞赏。
谢谢
迭代数组是最好的方法。这正是containsObject
方法在幕后所做的事情。你可以对数组进行排序,但这在效率方面不会给你太多。
如果您希望能够比O(n)更快地查找值,NSArray/NSMutableArray
可能不是适合您的数据结构。
灵感来自伯恩斯坦,我查了更多关于这个的信息,我找到了CFArrayContainsValue
BOOL CFArrayContainsValue(CFArrayRef theArray, CFRange range, const void *value);
例:
NSArray *numbers;
NSNumber *value;
BOOL found = CFArrayContainsValue ( (__bridge CFArrayRef)numbers,
CFRangeMake(0, numbers.count),
(CFNumberRef)value );
像魅力一样,真的很快!
NSPredicate *valuePredicate=[NSPredicate predicateWithFormat:@"self.intValue == %d",[myValueNumber intValue]];
if ([[numbersArray filteredArrayUsingPredicate:valuePredicate] count]!=0) {
// FOUND
}
else {
//NOT FOUND
}
有点晚了,但是由于数组已经被排序(排序),你应该使用CFArrayBSearchValues()进行二进制搜索。
数字示例:
NSArray *array; // or NSMutableArray
NSNumber *value; // search value
CFArrayBSearchValues((__bridge CFArrayRef)array, CFRangeMake(0, array.count),
(CFNumberRef)value, (CFComparatorFunction)CFNumberCompare, NULL);
如果不做太多,那么通过NSArray进行迭代是可以的。这就是“containsObject”的作用。但我发现当你需要大量的支票时,特别是如果阵列很大,它会减慢你的应用......
因此,如果需要经常检查,您可以始终使用字典而不是数组。键将是NSNumber,该字段将是它在数组中出现的次数。然后,使用“ObjectForKey”检查数字是否在数组中,如果需要,使用“allKeys”获取所有值,等等...
祝好运
您可以像这样检查:
if ([myArray indexOfObject:@(myNumber)] == NSNotFound) {
NSLog(@"myArray' contauns 'myNumber");
}
保持编码.......... :)