2010-03-29 52 views
3

我正在添加对象(在这种情况下是NSNumbers)到一个NSMutableArray,我想检查什么最好的方法是在添加之前检查数组中的重复项。 (即)检查NSMutableArray中的重复对象?

Number to add 
if (NSMutableArray does not contain Number) { 
    add Number 
} 

编辑:

非常感谢,我的NSArray在今天早上有一个好运气,但完全错过 “containsObject”。这样做可以做得很好,但是查看了NSMutableSet,这更符合我的需求。如果可以的话最后一个问题:

while([mySet count] < 5) { 
    NSNumber *numberToAdd = [NSNumber numberWithInt:random() %10]; 
    [mySet addObject:numberToAdd]; 
} 

我不认为它实际上是重要的,但它是最好检查组“containsObject”或只是扔掉重复而矣。

while([mySet count] < 5) { 
    NSNumber *numberToAdd = [NSNumber numberWithInt:random() %10]; 
    if(!mySet containsObject:numberToAdd) [mySet addObject:numberToAdd]; 
} 

再次非常感谢,这真的很酷,并会为我节省一堆时间。

加里

+2

这是不是真的与此问题相关的类别,但这样做'%10'是不会给你一个非常均匀分布的数。由于它不是素数,所以你的套牌会偏向小于5的数字,并且你几乎保证在你的套牌中有1和2。如果你使用素数,比如'%11',你会得到更均匀的分布。 – Alex 2010-03-29 16:24:59

回答

15

记住一个NSMutableArray是一个NSArray了。

if (![theArray containsObject:theNumber]) { 
    // does not contain. 
} 

(如果你想唯一对象,并不在乎广告订单中的NSMutableSet是一种更有效的容器)

0

试试这个:

// Number to add is newNumber, myArray is your Mutable array 
if(![myArray containsObject:newNumber]) 
{ 
    [myArray addObject:myNumber]; 
} 
1

这取决于有多大你数组可能会得到。您可以使用-containsObject:来检查数组中是否已有数据。这可能与阵列长度上的O(n*logn)一样糟糕,因此对于超大型数组并不好,但保持代码易于维护。

对于任意大小的数据集来说,通用的方法是将NSMutableSet与数组放在一起。在添加到数组之前,请检查项目是否存在。如果它已经在集合中,请不要添加它。如果不是,则将其添加到两者。

当然,如果你不关心顺序和唯一性,那么根本就不用数组,只需使用Set即可。

+1

实际上它比O(n)更差。苹果的文档指出:“线性搜索操作同样具有O(N * log N)的最坏情况复杂度,但通常情况下边界将更加紧密。” – kennytm 2010-03-29 14:48:47

+0

@Kenny:谢谢,这对我来说很有趣,也是新闻(更新后的答案)。在这一点上,似乎也是一种误称,称其为“线性搜索操作”。 :) – 2010-03-29 14:51:33

+0

等等......顺序搜索如何比O(n)更差?这对我来说没有意义。 – sudo 2014-03-16 21:45:35

5

要回答你的第二个问题:不,你并不需要检查该集合是否包含对象。当您致电addObject:时,NSMutableSet将为您做这件事。它可能有一个更有效的方法(因为它可以访问内部数据结构),所以你可能会通过让NSMutableSet处理它而获得轻微的性能优势。

如果没有其他的东西,那么你需要编写的代码越少,这总是很好。

1

我对NSMutableArray的

@interface NSMutableArray (CategoryName) 

- (void)addObjectUnique:(id)anObject; 

@end 

@implementation NSMutableArray (CategoryName) 

- (void)addObjectUnique:(id)anObject 
{ 
    if ([self containsObject:anObject]) { 
    return; 
    } 
    [self addObject:anObject]; 
} 

@end