我正在向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];
}
再次非常感谢,那真的很酷,并且会节省我一大堆时间。
加里
答案 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];
}