2011-06-09 50 views
40

我不知道如何去做這件事。我有一個NSMutableArray(addList),其中包含要添加到我的數據源NSMutableArray的所有項目。NSMutableArray檢查對象是否已經存在

我現在想檢查從addList數組添加的對象是否已經存在於數據源數組中。如果不存在,則添加該項目,如果存在則忽略。

這兩個對象都有一個名爲iName的字符串變量,我想比較。

這裏是我的代碼片段

-(void)doneClicked{ 
    for (Item *item in addList){ 
     /* 
     Here i want to loop through the datasource array 
     */ 
     for(Item *existingItem in appDelegate.list){ 
      if([existingItem.iName isEqualToString:item.iName]){ 
       // Do not add 
      } 
      else{ 
       [appDelegate insertItem:item]; 
      } 
     } 
} 

,但我覺得,即使存在要添加的項目。

我在做什麼錯了?

+0

這是一個邏輯錯誤,請參閱我的回答 – knuku 2011-06-09 11:04:02

回答

39

我找到了一個解決方案,可能不是最有效的全部,但ATLEAST工作

NSMutableArray *add=[[NSMutableArray alloc]init]; 

for (Item *item in addList){ 
     if ([appDelegate.list containsObject:item]) 
      {} 
     else 
      [add addObject:item]; 
} 

然後我迭代添加數組並插入項目。

5

你試過indexOfObject:

-(void)doneClicked{ 
    for (Item *item in addList){ 
     if([appDelegate.list indexOfObject:item] == NSNotFound){ 
      [appDelegate insertItem:item]; 
     } 
} 

UPDATE:你有一個合乎邏輯的錯誤,不誤代碼。假設第一個數組是['a','b','c'],第二個數組是['a','x','y','z']。當你通過第二個數組迭代'a'時,它不會在第一次迭代時向第二個數組添加'a'(比較'a'和'a'),但會在第二個數組中添加(比較'a'和'x 「)。這就是爲什麼你應該在你的'Item'對象中實現isEqual:方法(見下文)並使用上面的代碼。

- (BOOL)isEqual:(id)anObject { 
    if ([anObject isKindOfClass:[Item class]]) 
     return ([self.iName isEqualToString:((Item *)anObject).iName]); 
    else 
     return NO; 
} 
+0

@ NR4TR:我想單獨比較名稱。不是整個對象 – Neelesh 2011-06-09 10:43:18

+0

檢查出更新的答案 – knuku 2011-06-09 11:03:16

+0

是的,我現在得到它。但是,當我使用你已更新的代碼,我得到以下錯誤 [項目isEqualToString:]:無法識別的選擇器發送到實例0x712ee70 – Neelesh 2011-06-09 11:19:28

2

可以在物體上覆蓋isEqualshash以便它返回一個YES/NO基於所述INAME屬性的比較。

一旦你有,你可以使用...

- (void)removeObjectsInArray:(NSArray *)otherArray 

爲了將所有剩餘的對象之前清洗名單。

+0

首先,我想單獨比較名稱而不是整個對象 – Neelesh 2011-06-09 10:44:58

+1

考慮閱讀有關'isEquals'方法的文檔,它可以幫助 – knuku 2011-06-09 10:57:51

+1

是的,覆蓋isEquals的想法是,您可以定義您認爲的'通常情況下,運行時會查看兩個對象,如果它們不是同一個實例,則返回false。通過重寫isEquals方法,您可以說'實際上我不在乎對象是否不相同,在我眼中,這兩個項目是相同的,如果名稱匹配。' – 2011-06-09 10:58:09

1

轉換小寫和修剪空白,然後檢查..

[string lowercaseString]; 

NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
22

使用NSPredicate

NSArray *list = [[appDelegate.list copy] autorelease]; 

for (Item *item in addList) { 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"iName MATCHES %@", item.iName]; 
    NSArray *filteredArray = [list filteredArrayUsingPredicate:predicate]; 
    if ([filteredArray count] > 0) [appDelegate insertItem:item]; 
} 
+1

+1不錯的答案。避免瞭如果問題中使用的方法實際工作時會發生變異的收集異常。 – JeremyP 2011-06-09 11:20:57

+0

「list」數組的任何內存管理? :) – knuku 2011-06-09 11:23:09

+0

我嘗試了上面編輯的解決方案。首先,程序崩潰而不顯示任何錯誤。其次,即使它存在於數據源列表中,也會添加項目 – Neelesh 2011-06-09 11:27:29

2

NR4TR正確地說,但我認爲一個突破聲明足以


if([existingItem.iName isEqualToString:item.iName]){ 
       // Do not add 
break; 
      } 
+0

您可以粘貼該方法的整個代碼。 – Neelesh 2011-06-09 11:46:18

4

看看NSSet。您可以添加對象,只有在對象是唯一的時纔會添加對象。你可以從NSArray創建一個NSSet,反之亦然。

68

在NSArray中有一個非常有用的方法,即containsObject

NSArray *array; 
array = [NSArray arrayWithObjects: @"Nicola", @"Margherita",          @"Luciano", @"Silvia", nil]; 
if ([array containsObject: @"Nicola"]) // YES 
{ 
    // Do something 
} 
1

比較addList的第一個對象和appDelegate.list的第一個對象,如果它們不相等,則插入addList的對象。邏輯是錯誤的,你應該比較一個addList的對象與每個appDelegate.list的對象。

相關問題