我有两个自定义对象数组。两者都具有 NSString *name 的属性。我想检查是否
object.name in array1 == object.name in array2
我该怎么做?我必须形成一个谓词吗?我知道我可以强行使用它,只需枚举 array2 中的对象以检查它是否具有相同的名称,但我不知道是否有更好或理想的方法来完成这项任务。谢谢。
我有两个自定义对象数组。两者都具有 NSString *name 的属性。我想检查是否
object.name in array1 == object.name in array2
我该怎么做?我必须形成一个谓词吗?我知道我可以强行使用它,只需枚举 array2 中的对象以检查它是否具有相同的名称,但我不知道是否有更好或理想的方法来完成这项任务。谢谢。
使用 NSMutableSet 的intersectSet:
方法。
拉出要相交的属性值数组,并将第一个数组转换为可变集:NSMutableSet *setA = [NSMutableSet setWithArray:[arrayA valueForKey:@"name"]];
将它与数组 B 中的属性值相交。[setA intersectSet:[NSSet setWithArray:[arrayB valueForKey:@"name"]];
如果你想把它组合成一条很长的线,你可以这样做:
NSSet *commonProperties = [[NSMutableSet setWithArray:[arrayA valueForKey:@"name"]] intersectSet:[NSSet setWithArray:[arrayB valueForKey:@"name"]]];
当然,这只会给你 name 属性,而不是对象本身。如果您想要整个对象,请覆盖isEqual:
并在那里进行名称检查。然后您可以消除该valueForKey:
部分并与两组相交。
其余值将是公共值。NSSet
字符串比较在对象isEqualToString:
的幕后使用NSString
。
你想的很好。在您知道类型的范围内,指定它们以便编译器和将来阅读代码的人清楚。此外,使用 isEqualToString: 比较字符串。
for (Foo *foo in myFooCollection) {
for (Bar *bar in myBarCollection) {
if ([foo.name isEqualToString:bar.name]) {
// match
}
}
}
您可能会考虑的另一件事是在 Foo 和 Bar 对象上实现 compare:。
// Foo.m
- (NSComparisonResult)compare:(id)otherObject {
if ([otherObject isKindOfClass:[Bar self]]) {
Bar *itsABar = (Bar *)otherObject;
return [self.name compare:itsABar.name];
}
return [super compare:otherObject];
}
酒吧也是如此。
即使您使用谓词,在内部它也会获取数组中的每个对象并进行比较。数组collection
不是原始数据类型,无法一次性进行比较。