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