我不知道该如何解决这个问题。我有一个 NSMutableArray (addList),它包含要添加到我的数据源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 :(得分:72)
在NSArray中有一个非常有用的方法,即 containsObject 。
NSArray *array;
array = [NSArray arrayWithObjects: @"Nicola", @"Margherita", @"Luciano", @"Silvia", nil];
if ([array containsObject: @"Nicola"]) // YES
{
// Do something
}
答案 1 :(得分:39)
我找到了一个解决方案,可能不是最有效的解决方案,但最重要的是
NSMutableArray *add=[[NSMutableArray alloc]init];
for (Item *item in addList){
if ([appDelegate.list containsObject:item])
{}
else
[add addObject:item];
}
然后我迭代添加数组并插入项目。
答案 2 :(得分: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];
}
答案 3 :(得分:5)
您是否尝试过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'),但会在第二个数组中添加(比较'a'和'x' “)。这就是为什么你应该在'Item'对象中实现isEqual:
方法(见下文)并使用上面的代码。
- (BOOL)isEqual:(id)anObject {
if ([anObject isKindOfClass:[Item class]])
return ([self.iName isEqualToString:((Item *)anObject).iName]);
else
return NO;
}
答案 4 :(得分:4)
看看NSSet。您可以添加对象,只有在对象是唯一的时才会添加对象。您可以从NSArray创建NSSet,反之亦然。
答案 5 :(得分:2)
您可以覆盖对象上的isEquals
和hash
,以便根据iName属性的比较返回YES / NO。
一旦你有了,你就可以使用......
- (void)removeObjectsInArray:(NSArray *)otherArray
在添加所有剩余对象之前清理列表。
答案 6 :(得分:2)
NR4TR说得对,但我认为一个中断语句就足够了
if([existingItem.iName isEqualToString:item.iName]){
// Do not add
break;
}
答案 7 :(得分:1)
转换小写并修剪空格,然后检查..
[string lowercaseString];
和
NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
答案 8 :(得分:1)
比较addList的第一个对象和appDelegate.list的第一个对象,如果它们不相等,则插入addList的对象。逻辑错误,您应该将一个addList的对象与每个appDelegate.list的对象进行比较。