检查NSArray中是否包含某个整数

16

我有一个NSMutableArray,里面是一些NSNumbers。基本上,我想检查数组中是否有任何NSNumbers等于某个值。

我可以通过迭代数组逐个进行检查,但这绝不是最优的方法。

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

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

感谢任何答案。

谢谢


如果您的数组未排序,则没有比O(n)更有效的方法来检查您想要的内容,迭代会执行此操作。任何其他方式都必须先对数组进行排序(O(nlogn)),然后才能更有效地搜索它(O(logn))。 - dtech
该数组并未使用任何排序方法进行排序,但是由于我添加对象的方式,该数组已经按数字顺序排列。它被排序有什么帮助呢? - Henry
1
如果已经排序,您可以使用O(logn)的速度进行二分搜索。 - dtech
6个回答

20

受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 -
1
好的,很好的发现,可能忘记改了。已经为您更新了答案! - Tieme

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

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

    else  {
       //NOT FOUND
    }

5

在这里,遍历数组是最好的方法。这正是containsObject方法在内部执行的操作。你可以对数组进行排序,但这对效率来说并没有太大帮助。

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


谢谢,做这种事情有更好的结构吗? - Henry
很难说,不知道你具体想做什么。也许你应该在另一个SO问题中描述你的情况? - csano
2
NSArray/NSMutableArray是快速查找的正确数据结构!只需使用CFArrayBSearchValues(...)。 - bernstein

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,那么这个方法“containObject”是可以使用的。但是当你需要大量检查的时候,特别是当数组很大的时候,它会减慢你的应用程序...

因此,如果你需要经常进行这样的检查,你可以使用字典而不是数组。其中键将是NSNumber,字段将是它在数组中出现的次数。然后,你可以使用“ObjectForKey”来检查数字是否在数组中,你可以使用“allKeys”来获取所有值(如果需要),等等...

祝好运


1
您可以这样简单地检查:

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

保持编程…… :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接