2010-03-29 86 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