我有两个自定义对象数组。两者都具有NSString *名称的属性。我想检查是否检查数组是否包含特定属性的对象,objective-c
object.name in array1 == object.name in array2
我该怎么做?我必须形成一个谓词吗?我知道我可以强制它,只是枚举array2中的对象来检查它是否具有相同的名称,但我不知道是否有更好的表现或理想的方式来完成这项任务。谢谢。
我有两个自定义对象数组。两者都具有NSString *名称的属性。我想检查是否检查数组是否包含特定属性的对象,objective-c
object.name in array1 == object.name in array2
我该怎么做?我必须形成一个谓词吗?我知道我可以强制它,只是枚举array2中的对象来检查它是否具有相同的名称,但我不知道是否有更好的表现或理想的方式来完成这项任务。谢谢。
你在想什么很好。在你确实知道类型的情况下,指定它们在编译器和人们将来阅读代码时清楚。另外,使用isEqualToString:来比较字符串。
for (Foo *foo in myFooCollection) {
for (Bar *bar in myBarCollection) {
if ([foo.name isEqualToString:bar.name]) {
// match
}
}
}
您可能会考虑的另一件事是实现比较:对Foo和Bar对象。
// 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];
}
同样适用于Bar。
即使使用谓词,它在内部也会将数组中的每个对象和比较。 Array是一个不像原始数据类型的collection
,并且无法在一次飞行中进行比较。
使用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"]]];
当然,这只会给你名称属性,而不是对象本身。如果您想要整个对象,请覆盖isEqual:
并在那里进行名称检查。然后你可以消除valueForKey:
部分,只是相交两组。
其余值将是常见的值。 NSSet
字符串比较使用isEqualToString:
后台的NSString
对象。
不太清楚你的意思。你想检查array1中的每个对象是否与array2中同一个索引中的对象具有相同的名称,或者你想检查array1中的任何对象是否与array2中的任何对象具有相同的名称,或者是否有第三个选项? – Chuck