6

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

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

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];
}

这可以用谓词代替吗?

4

2 回答 2

7

这个谓词格式字符串应该可以工作:

@"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 类参考
NSMutableArray 类参考
谓词编程指南

于 2010-12-03T19:25:14.270 回答
0

查看 Apple 给出的将谓词与数组一起使用的示例。它采用filteredArrayUsingPredicate。

于 2010-12-03T18:57:08.883 回答