我为这个基本问题道歉,但我对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:我已经知道我可以循环遍历整个数组,以检查数据是否已经存在。寻找更好的解决方案,因为阵列可能有数千条记录。
答案 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
是一个模型类,并且它有三个字符串属性 - code
,data
& 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];