检查数组是否包含特定属性的对象,objective-c

时间:2012-04-30 17:03:10

标签: iphone objective-c

我有两个自定义对象数组。两者都具有NSString * name的属性。我想检查一下

object.name in array1 == object.name in array2

我该怎么做?我必须形成谓词吗?我知道我可以强制它并且只是枚举array2中的对象以检查它是否具有相同的名称,但我不知道是否有更好的或理想的方式来执行此任务。感谢。

3 个答案:

答案 0 :(得分:2)

你的想法很好。在您知道类型的情况下,使用编译器和将来阅读代码的人员指定它们。另外,使用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也一样。

答案 1 :(得分:2)

使用NSMutableSet的intersectSet:方法。

  1. 拉出要交叉的属性值数组,并将第一个数组转换为可变集:NSMutableSet *setA = [NSMutableSet setWithArray:[arrayA valueForKey:@"name"]];

  2. 将其与数组B中的属性值相交。[setA intersectSet:[NSSet setWithArray:[arrayB valueForKey:@"name"]];

  3. 如果你想将它组合成一个非常长的行,你可以这样做:

    NSSet *commonProperties = [[NSMutableSet setWithArray:[arrayA valueForKey:@"name"]] intersectSet:[NSSet setWithArray:[arrayB valueForKey:@"name"]]];
    

    当然,这只会给你name属性,而不是对象本身。如果您想要整个对象,请覆盖isEqual:并在那里进行名称检查。然后你可以消除valueForKey:部分并且只是交叉两组。

    其余值将是常用值。 NSSet字符串比较在isEqualToString:对象的幕后使用NSString

答案 2 :(得分:1)

即使您在内部使用谓词,它也会将每个对象放在数组中并进行比较。数组是collection不像原始数据类型,并且无法在一次飞行中进行比较。