2010-12-03 19 views
5

¿Hay alguna manera de hacerlo? Tengo un conjunto de elementos que quiero excluir de otro conjunto. Sé que podría recorrer cada elemento en mi conjunto y solo agregarlo a mi filtrado si no está en el otro conjunto, pero sería bueno si pudiera usar un predicado.NSPredicar para filtrar todos los elementos que están en otro conjunto

El conjunto de elementos a excluir no es un conjunto del mismo tipo de objeto directamente; es un conjunto de cuerdas; y yo quiero excluir cualquier cosa de mi primer juego si uno de los atributos coincida con esa cadena .... en otras palabras:

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

se puede hacer esto con un predicado en su lugar?

Respuesta

6

Este predicado debería funcionar:

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

combinarlo con el método de filtrado NSArray apropiado. Si self.questions es una NSArray inmutable regulares, se vería algo así como

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

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

Si se trata de un NSMutableArray, el uso apropiado sería

[self.questions filterUsingPredicate:predicate]; 

tener cuidado con esto último, sin embargo, que modifica la matriz existente para adaptarse al resultado Puede crear una copia de la matriz y filtrar la copia para evitar eso, si es necesario.

Referencia:
NSArray Class Reference
NSMutableArray Class Reference
Predicate Programming Guide

+0

Impresionante, "NINGUNO" funcionó a la perfección. Lo que me faltaba era que no me daba cuenta de que podía pasar una Matriz o un Conjunto al formato predicado como lo haría con cualquier otro objeto. ¡Gracias! – GendoIkari

0

Eche un vistazo al ejemplo dado por Apple para usar predicates with arrays. Emplea filteredArrayUsingPredicate. cadena de formato

+0

Sé que necesito utilizar filteredArrayUsingPredicate, pero no sé cómo un predicado puede comprobar si una matriz diferente contiene un cierto valor. – GendoIkari

+0

Disculpas, dedo de disparo con picazón. ¿Puedes usar una subconsulta con un segundo predicado, algo así como: http://www.answerspice.com/c119/1665179/can-an-nspredicate-search-for-an-object-within-an-array -owned-by-an-object-in-another-array? – jarmod

Cuestiones relacionadas