如何查找NSMutableArray中是否已存在具有相同数据的类的对象?

时间:2015-10-07 07:47:34

标签: objective-c

我为这个基本问题道歉,但我对obj-c已经有2个月新了。

问题: 我无法找到NSMutableArray中是否已存在具有相同数据的对象。

我在做什么?

ScanDigInfoForTable* sfile = [[ScanDigInfoForTable alloc]init];        
sfile.data = "myData";


int inde = [_DataList indexOfObject:sfile] ;        
if(inde == -1)
    [_DataList addObject:sfile];

ScanDigInfoForTable* sfile2 = [[ScanDigInfoForTable alloc]init];        
sfile2.data = "myData";


inde = [_DataList indexOfObject:sfile2] ;        
if(inde == -1)
    [_DataList addObject:sfile2];

问题: _DataList获取2个对象而不是1.非常感谢您的注意。

S.P:我已经知道我可以循环遍历整个数组,以检查数据是否已经存在。寻找更好的解决方案,因为阵列可能有数千条记录。

4 个答案:

答案 0 :(得分:2)

在Objective-C中,对象的相等性由方法-isEqual:-hash决定。

在集合中测试对象成员资格时,集合的项目将被发送isEqual:。默认实现仅比较对象的地址,这就是您看到重复的原因。您的对象不会根据它们包含的数据提供自己的相等实现。

要解决此问题,您可以覆盖isEqual:以根据对象所代表的数据对对象进行比较。在您的问题中使用您的示例,这可能只是:

- (BOOL) isEqual:(id)object {
    BOOL result = N0;
    if (object != self){
        if ([object isKindOfClass:[self class]]){
            result = [[self data] isEqual:[(ScanDigInfoForTable *)object data]];
        }
    } else {
      result = YES;
    }
    return result;
}

Mike Ash有一篇关于实现平等的好文章。通常,如果要实现自定义类,则应将相等性作为其中的一部分。

答案 1 :(得分:2)

那么,比较两个自定义对象实际上并不是那么简单,因为没有明确的方法来声明相等性。为他们正在创建的对象定义相等规则是个人选择。

在您的情况下,这将是两个步骤:

第1步:isEqual:课程中实施ScanDigInfoForTable。假设ScanDigInfoForTable是一个模型类,并且它有三个字符串属性 - codedata& itemID(您可以使用任何类型)。

- (BOOL)isEqual:(ScanDigInfoForTable *)other {
    return [self.code isEqualToString:other.code] && [self.data isEqualToString:other.data] && [self.itemID isEqualToString:other.itemID];
}

第2步:containsObject:上调用NSMutableArray方法。此方法将在内部调用isEqual:,根据您定义的规则为您提供结果。

// If the object does not exist in the list, we add it

if (![_DataList containsObject:sfile2]) {
    [_DataList addObject:sfile2];
}

答案 2 :(得分:-1)

您可以使用filteredArrayUsingPredicate例如

NSArray * matches = [_DataList filteredArrayUsingPredicate:
                    [NSPredicate predicateWithFormat:@"data == %@ ",sfile2.data]];
if(matches.count == 0) {
    [_DataList addObject:sfile2];
}

答案 3 :(得分:-1)

这样的东西?

 NSMutableSet* set1 = [NSMutableSet setWithArray:array1];
 NSMutableSet* set2 = [NSMutableSet setWithArray:array2];
 [set1 intersectSet:set2]; //this will give you only the obejcts that are in both sets

 NSArray* result = [set1 allObjects];

这样做的好处是不会查找数组中的对象,同时循环遍历另一个具有N ^ 2复杂度的数组。

并且set2也不一定是可变的,也可以只使用

 NSSet* set2 = [NSSet setWithArray:array2];