NSMutableArray检查对象是否已存在

时间:2011-06-09 10:31:26

标签: iphone objective-c ios nsmutablearray

我不知道该如何解决这个问题。我有一个 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];
            } 
        }
}

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

我做错了什么?

9 个答案:

答案 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)

您可以覆盖对象上的isEqualshash,以便根据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的对象进行比较。