NSMutableArray检查对象是否已经存在

我不知道如何去做这件事。 我有一个NSMutableArray (addList),其中包含所有要添加到我的数据源NSMutableArray的项目。

我现在想检查从addList数组添加的对象是否已经存在于数据源数组中。 如果不存在,添加该项目,如果存在则忽略。

这两个对象都有一个名为iName的stringvariables,我想比较。

这是我的代码片段

-(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]; } } } 

但是,即使存在,我也find要添加的项目。

我究竟做错了什么 ?

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

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

我find了一个解决scheme,可能不是最有效率的,但至less是有效的

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

然后我迭代添加数组并插入项目。

使用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]; } 

你有没有尝试indexOfObject:

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

更新:你有一个逻辑错误,而不是在代码中的错误。 假设第一个数组是['a','b','c'],第二个是['a','x','y','z']。 当你通过第二个数组迭代'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; } 

看看NSSet。 您可以添加对象,只有在对象是唯一的时才会添加对象。 你可以从NSArray创build一个NSSet,反之亦然。

您可以覆盖对象上的isEqualshash ,以便根据iName属性的比较返回YES / NO。

一旦你有,你可以使用…

 - (void)removeObjectsInArray:(NSArray *)otherArray 

在添加所有剩余的对象之前清理列表。

NR4TR说得对,但我认为一个突破语句就足够了

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

转换小写和修剪空白,然后检查..

 [string lowercaseString]; 

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

比较addList的第一个对象和appDelegate.list的第一个对象,如果它们不相等,则插入addList的对象。 逻辑是错误的,你应该比较一个addList的对象与每个appDelegate.list的对象。