NSPredicate, чтобы отфильтровать все элементы из другого набора - PullRequest
5 голосов
/ 03 декабря 2010

Есть ли способ сделать это? У меня есть набор предметов, которые я хочу исключить из другого набора. Я знаю, что мог бы пройтись по каждому элементу в моем наборе и добавить его в свой FilterSet, только если его нет в другом наборе, но было бы неплохо, если бы я мог использовать предикат.

Набор исключаемых элементов не является набором объектов одного типа напрямую; это набор строк; и я хочу исключить что-либо из моего первого набора, если один из атрибутов соответствует этой строке .... другими словами:

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 ]

6 голосов
/ 03 декабря 2010

Эта строка формата предиката должна работать:

@"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
Руководство по программированию предиката

0 голосов
/ 03 декабря 2010

Посмотрите пример, приведенный Apple для использования предикатов с массивами .Он использует фильтрованный массив массива.

...