检查NSArray是否包含一些int

问题描述 投票:16回答:6

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

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

我也尝试过使用containsObject失败了,因为这只有在id相同时才有效。

我读了一些关于NSPredicate的东西,这似乎是一个很好的解决方案,但我不确定如何使用它与NSArray

任何答案都表示赞赏。

谢谢

objective-c nsmutablearray nspredicate nsnumber
6个回答
5
投票

迭代数组是最好的方法。这正是containsObject方法在幕后所做的事情。你可以对数组进行排序,但这在效率方面不会给你太多。

如果您希望能够比O(n)更快地查找值,NSArray/NSMutableArray可能不是适合您的数据结构。


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 );

像魅力一样,真的很快!


12
投票
    NSPredicate *valuePredicate=[NSPredicate predicateWithFormat:@"self.intValue == %d",[myValueNumber intValue]];

    if ([[numbersArray filteredArrayUsingPredicate:valuePredicate] count]!=0) {   
        // FOUND
    }

    else  {
       //NOT FOUND
    }

3
投票

有点晚了,但是由于数组已经被排序(排序),你应该使用CFArrayBSearchValues()进行二进制搜索。

数字示例:

NSArray *array; // or NSMutableArray
NSNumber *value; // search value
CFArrayBSearchValues((__bridge CFArrayRef)array, CFRangeMake(0, array.count),                   
        (CFNumberRef)value, (CFComparatorFunction)CFNumberCompare, NULL);

2
投票

如果不做太多,那么通过NSArray进行迭代是可以的。这就是“containsObject”的作用。但我发现当你需要大量的支票时,特别是如果阵列很大,它会减慢你的应用......

因此,如果需要经常检查,您可以始终使用字典而不是数组。键将是NSNumber,该字段将是它在数组中出现的次数。然后,使用“ObjectForKey”检查数字是否在数组中,如果需要,使用“allKeys”获取所有值,等等...

祝好运


1
投票

您可以像这样检查:

if ([myArray indexOfObject:@(myNumber)] == NSNotFound) {
    NSLog(@"myArray' contauns 'myNumber");
}

保持编码.......... :)

© www.soinside.com 2019 - 2024. All rights reserved.