我有一个NSMutableArray
,里面是一些NSNumbers
。基本上,我想检查数组中是否有任何NSNumbers
等于某个值。
我可以通过迭代数组逐个进行检查,但这绝不是最优的方法。
我也尝试过使用containsObject
,但失败了,因为这仅在id相同时才有效。
我读到了关于NSPredicate
的一些内容,这似乎是一个很好的解决方案,但我不确定如何将其与NSArray
一起使用。
感谢任何答案。
谢谢
我有一个NSMutableArray
,里面是一些NSNumbers
。基本上,我想检查数组中是否有任何NSNumbers
等于某个值。
我可以通过迭代数组逐个进行检查,但这绝不是最优的方法。
我也尝试过使用containsObject
,但失败了,因为这仅在id相同时才有效。
我读到了关于NSPredicate
的一些内容,这似乎是一个很好的解决方案,但我不确定如何将其与NSArray
一起使用。
感谢任何答案。
谢谢
受Bernstein的启发,我查找了更多关于此事并发现了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 );
运行得非常好,速度也真的很快!
selectedItems
是什么? - Ky - NSPredicate *valuePredicate=[NSPredicate predicateWithFormat:@"self.intValue == %d",[myValueNumber intValue]];
if ([[numbersArray filteredArrayUsingPredicate:valuePredicate] count]!=0) {
// FOUND
}
else {
//NOT FOUND
}
在这里,遍历数组是最好的方法。这正是containsObject
方法在内部执行的操作。你可以对数组进行排序,但这对效率来说并没有太大帮助。
如果您想要比O(n)更快地查找值,NSArray/NSMutableArray
可能不是适合您的数据结构。
虽然有点晚,但由于数组已经排序,您应该使用CFArrayBSearchValues()进行二分查找。
数字示例:
NSArray *array; // or NSMutableArray
NSNumber *value; // search value
CFArrayBSearchValues((__bridge CFArrayRef)array, CFRangeMake(0, array.count),
(CFNumberRef)value, (CFComparatorFunction)CFNumberCompare, NULL);
如果你不需要频繁地遍历NSArray,那么这个方法“containObject”是可以使用的。但是当你需要大量检查的时候,特别是当数组很大的时候,它会减慢你的应用程序...
因此,如果你需要经常进行这样的检查,你可以使用字典而不是数组。其中键将是NSNumber,字段将是它在数组中出现的次数。然后,你可以使用“ObjectForKey”来检查数字是否在数组中,你可以使用“allKeys”来获取所有值(如果需要),等等...
祝好运
if ([myArray indexOfObject:@(myNumber)] == NSNotFound) {
NSLog(@"myArray' contauns 'myNumber");
}