2013-10-21 52 views
1

我有一個NSObject與NSStrings裏面。如何將具有唯一obj.name的對象僅添加到NSMutableArray?我試過NSOrderedSet,但它只適用於將NSString添加到數組而不使用NSString內的對象。如何將獨特的對象添加到nsmutablearray?

例子。

@@interface MyObject : NSObject 
@property (strong, nonatomic) NSString *name; 
@end 


NSMutableArray *array = {MyObject.name,MyObject.name,MyObject.name}; 

如何確保沒有兩個MyObjects具有相同的名稱?

回答

4

如果不存在,則使用NSPredicate在NSMutableArray中篩選對象,然後將其添加到NSMutableArray中。 試試這個。

NSArray * filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name = %@", @"MyObject.name"]]; 
    if(![array count]) 
     [array addObject:MyObject ]; 
+0

你是不是指'if(![filtered count])'? – Putz1103

+0

@ Putz1103它會檢查數組中是否存在對象,如果存在,那麼在上面的代碼中會出現已過濾數組中的計數 – Rocker

+0

謝謝。這解決了我的問題。 –

1

所有的NSSet類結合使用isEqual:hash:比較平等。 因爲你還沒有重新定義這些,所以只需在一個集合中存儲兩個具有相同名稱的對象,因爲將使用isEqual:hash:的NSObject實現。

documentationNSObject Protocol討論重寫isEqualhashThis上一個回答Stackoverflow詳細信息如何正確實施hashisEqual

在您自己的散列實現中,您可以使用NSStringhash方法。

- (NSUInteger) hash { 
    NSUInteger prime = 31; 
    NSUInteger result = 1; 

    result = prime * result + [super hash]; 
    result = prime * result + self.name == nil ? 0 : [self.name hash]; 

    return result; 
} 

- (bool) isEqual:(id)other { 
    if (other == self) { 
     return YES; 
    } 
    if (!other || ![other isKindOfClass:[self class]]) { 
     return NO; 
    } 

    return [self.name isEqualToString:other.name]; 
} 
0

就個人而言,我會用的NSMutableDictionary與MyObject.name作爲鍵。這樣,所有你需要做的是這樣的:

if(myDictionary[MyObject.name] == nil) 
{ 
    myDictionary[MyObject.name] = MyObject; 
} 

比使用基於你在做加法的數量有規律的NSMutableArray有效得多。另外,如果你想獲得的所有值的數組訪問,所有你需要做的是:

NSArray *array = [myDictionary allValues]; 

大-O運行時的NSPredicate是O(n),其中字典的方法是O(1) 。

相關問題