2010-12-03 4 views
5

Gibt es eine Möglichkeit, dies zu tun? Ich habe eine Reihe von Elementen, die ich von einem anderen Set ausschließen möchte. Ich weiß, ich könnte jedes Element in meinem Set durchlaufen und es nur meinem filteredSet hinzufügen, wenn es nicht in dem anderen Set ist, aber es wäre schön, wenn ich ein Prädikat verwenden könnte.NSPredieren, um alle Elemente herauszufiltern, die sich in einem anderen Satz befinden

Die Menge der auszuschließenden Elemente ist nicht eine Gruppe desselben Objekttyps direkt. es ist eine Reihe von Saiten; und ich möchte etwas von meinem ersten Satz ausschließen, wenn eines der Attribute, die Zeichenfolge entspricht .... mit anderen Worten:

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

Kann dies mit einem Prädikat stattdessen tun?

Antwort

6

Dieses Prädikat Format-String sollte funktionieren:

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

Kombinieren Sie es mit den entsprechenden NSArray Filterverfahren. Wenn self.questions eine regelmäßige unveränderliche NSArray ist, es so etwas wie

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

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

aussehen würde, wenn es eine NSMutableArray ist, die entsprechende Nutzung

[self.questions filterUsingPredicate:predicate]; 

Seien Sie vorsichtig mit diesem letzten obwohl sein würde, ändert sie die bestehende Array um das Ergebnis anzupassen. Sie können eine Kopie des Arrays erstellen und die Kopie filtern, um dies bei Bedarf zu vermeiden.

Referenz:
NSArray Class Reference
NSMutableArray Class Reference
Predicate Programming Guide

+0

Super, "NONE" hat perfekt funktioniert. Was mir fehlte, war, dass ich nicht erkannte, dass ich ein Array oder Set einfach in das Prädikat-Format übergeben konnte, wie Sie es bei jedem anderen Objekt tun würden. Vielen Dank! – GendoIkari

0

Schauen Sie sich das Beispiel von Apple für die Verwendung von predicates with arrays an. Es verwendet filteredArrayUsingPredicate.

+0

Ich weiß, dass ich brauche filteredArrayUsingPredicate zu verwenden, aber ich weiß nicht, wie ein Prädikat überprüfen können, ob ein anderes Array einen bestimmten Wert enthält. – GendoIkari

+0

Entschuldigung, juckender Triggerfinger. Können Sie eine Unterabfrage mit einem zweiten Prädikat verwenden, etwa so: http://www.answerspice.com/c119/1665179/can-an-nspredicate-search-for-an-object-within-an-array ein Objekt-in-einem anderen-Array? – jarmod

Verwandte Themen