检查NSMutableArray中的重复对象?

时间:2010-03-29 14:41:00

标签: objective-c cocoa

我正在向NSMutableArray添加对象(在本例中为NSNumbers),我想检查在添加之前检查数组中重复项的最佳方法。 (即)

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];
}

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

加里

5 个答案:

答案 0 :(得分:15)

记住NSMutableArray也是一个NSArray。

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

(如果你想要唯一的对象而不关心插入顺序,NSMutableSet是一个更有效的容器。)

答案 1 :(得分:5)

回答你的第二个问题:不,你真的不需要检查该集是否已包含该对象。致电NSMutableSet时,addObject:会为您执行此操作。它可能有一种更有效的方法(因为它可以访问内部数据结构),所以通过让NSMutableSet处理它可能最终会带来轻微的性能优势。

如果不出意外,你需要写的代码就少了,这总是很好。

答案 2 :(得分:1)

这取决于你的阵列可能有多大。您可以使用-containsObject:检查数组中是否已存在某些内容。这可能与数组长度上的O(n*logn)一样糟糕,因此对超大数组没有好处,但保持代码易于维护。

通常对任意大小的数据集执行此操作的一般方法是在数组旁边保留NSMutableSet。在添加到数组之前,检查集合是否存在项目。如果它已经在集合中,请不要添加它。如果没有,请将其添加到两者。

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

答案 3 :(得分: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

答案 4 :(得分:0)

试试这个:

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