检查NSArray是否包含一些int

时间:2011-08-07 06:47:13

标签: objective-c nsmutablearray nspredicate nsnumber

我有NSMutableArray NSNumbers。基本上我只想检查数组中的NSNumbers是否有任何值。

我可以遍历数组,逐个检查,这绝不是最佳选择。

我也尝试过使用containsObject并尝试失败,因为这只有在id相同的情况下才有效。

我读过有关NSPredicate的内容,这似乎是一个很好的解决方案,但我不确定如何将它与NSArray一起使用。

感谢任何回答。

由于

6 个答案:

答案 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");
}

继续编码..........:)