NSMutableArray检查对象是否已存在

Nee*_*esh 42 iphone objective-c nsmutablearray ios

我不知道该如何解决这个问题.我有一个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];
            } 
        }
}
Run Code Online (Sandbox Code Playgroud)

但即使它存在,我也会发现要添加的项目.

我究竟做错了什么 ?

小智 72

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

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


Nee*_*esh 39

我找到了一个解决方案,可能不是最有效的解决方案,但至少可行

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

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

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


Emp*_*ack 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];
}
Run Code Online (Sandbox Code Playgroud)


knu*_*uku 5

你试过indexOfObject:吗?

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

更新:你有一个逻辑错误,而不是代码中的错误.假设第一个数组是['a','b','c'],第二个数组是['a','x','y','z'].当您通过第二个数组使用'a'进行迭代时,它不会在第一次迭代中将'a'添加到第二个数组(比较'a'和'a'),但会在第二个数组中添加(比较'a'和'x' ").这就是为什么你应该isEqual:在'Item'对象中实现方法(见下文)并使用上面的代码.

- (BOOL)isEqual:(id)anObject {
    if ([anObject isKindOfClass:[Item class]])
        return ([self.iName isEqualToString:((Item *)anObject).iName]);
    else
        return NO;
}
Run Code Online (Sandbox Code Playgroud)