在NSMutableArray中检查重复对象?

4

我正在向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];
}

我认为这并不重要,但是检查集合中是否包含对象更好,还是直接丢弃重复的并继续操作。

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

非常感谢,这真的很棒,将为我节省大量时间。

gary


2
这与你的问题并不直接相关,但是使用“%10”不会给你一个非常均匀分布的数字。由于它不是质数,你的集合将偏向于小于5的数字,并且几乎可以保证你的集合中会有1和2。如果你使用一个质数,比如“%11”,你会得到更均匀的分布。 - Alex
5个回答

15

记住,NSMutableArray也是NSArray。

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

(如果您需要唯一对象且不关心插入顺序,NSMutableSet是一个更高效的容器。)


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

1

这取决于你的数组有多大。你可以使用-containsObject:来检查数组中是否已经存在某个元素。这可能会导致O(n*logn)的时间复杂度,因此对于超大的数组来说并不好,但是可以保持代码简单易维护。

然而,一般情况下处理任意大小的数据集的通用方法是在数组旁边保留一个NSMutableSet。在添加到数组之前先检查集合中是否存在该项。如果它已经在集合中,则不要将其添加到数组中。如果不存在,则同时将其添加到两者中。

当然,如果您不关心顺序,只关心唯一性,那么根本不需要使用数组,只需使用集合即可。


1
实际上,它比O(n)更糟糕。苹果的文档指出:“线性搜索操作同样具有O(N*log N)的最坏复杂度,尽管通常边界会更紧。” - kennytm
@Kenny:谢谢,这很有趣,并且是我所不知道的新消息(更新的答案)。此外,在那一点上称它为“线性搜索操作”似乎是一个错误的用词。 :) - Ben Zotto
等等……顺序搜索怎么可能比O(n)更糟糕?这对我来说没有意义。 - sudo
@9000:因为 NSArray 实际上并不保证(通常也不是)由纯线性 C 数组支持。苹果的文档为 getter 给出了最坏情况下 O(log n) 的边界,这意味着遍历每个项(检查存在性)可能会像 O(n log n) 一样糟糕。请参阅此文章以获取一些图表:http://ridiculousfish.com/blog/posts/array.html - Ben Zotto

0

试试这个:

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

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