NSPredicate过滤掉另一组中的所有项目

时间:2010-12-03 17:39:44

标签: objective-c ios nspredicate nsset

有没有办法做到这一点?我有一组项目,我想从另一组中排除。我知道我可以遍历我的集合中的每个项目,只将它添加到我的filteredSet中,如果它不在另一个集合中,但如果我可以使用谓词那么会很好。

要排除的项目集不是直接相同类型对象的集合;这是一组字符串;如果其中一个属性与该字符串匹配,我想从我的第一个集合中排除任何内容....换句话说:

NSMutableArray *filteredArray = [NSMutableArray arrayWithCapacity:self.questionChoices.count];

BOOL found;

for (QuestionChoice *questionChoice in self.questionChoices)
{
    found = NO;

    for (Answer *answer in self.answers)
    {
        if ([answer.units isEqualToString:questionChoice.code])
        {
            found = YES;
            break;
        }
    }

    if (!found)
        [filteredArray addObject:questionChoice];
}

这可以用谓词来完成吗?

2 个答案:

答案 0 :(得分:6)

此谓词格式字符串应该起作用:

@"NONE %@.units == code", self.answers

将其与适当的NSArray过滤方法结合使用。如果self.questions是常规的不可变NSArray,它看起来像

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE %@.units == code", self.answers]

NSArray *results = [self.questions filteredArrayUsingPredicate:predicate];

如果它是NSMutableArray,则适当的用法是

[self.questions filterUsingPredicate:predicate];

但要注意最后一个,它会修改现有数组以适应结果。如果需要,您可以创建数组的副本并过滤副本以避免这种情况。

参考:
NSArray Class Reference
NSMutableArray Class Reference
Predicate Programming Guide

答案 1 :(得分:0)

查看Apple提供的使用predicates with arrays的示例。它使用filteredArrayUsingPredicate。