iphone nsmutablearray intersection

iphone - Encontrar la intersección de NSMutableArrays



intersection (5)

Aquí hay una variante de trabajo de los enlaces de arriba

NSPredicate *intersectPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@500, @400, @600]]; NSArray *intersect = [@[@200, @300, @400] filteredArrayUsingPredicate:intersectPredicate];

Tengo tres NSMutableArray que contienen nombres que se agregan a las listas de acuerdo con diferentes criterios.

Aquí están los pseudocódigos de mi arrays:

NSMutableArray *array1 = [@"Jack", @"John", @"Daniel", @"Lisa"]; NSMutableArray *array2 = [@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica"]; NSMutableArray *array3 = [@"Jack", @"Jerome", @"Dan", @"Lindsay", @"Lisa"];

Quiero encontrar una cuarta matriz que incluye la intersección de esas tres matrices. En este caso, por ejemplo, será:

NSMutableArray *array4 = [@"Jack",@"Lisa"];

Porque los tres arreglos tienen a Jack e Lisa como un elemento. ¿Hay forma de simplemente hacer esto?


Eche un vistazo a esta publicación .

En resumen: si puede usar NSSet en lugar de NSArray, entonces es trivial (NSMutableSet tiene intersectSet: :).

De lo contrario, puede construir un NSSet desde su NSArray y volver al caso anterior.


Esto es más limpio que el enfoque NSSet , y no perderá el orden original.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@ AND self IN %@", array2, array3]; NSArray *array4 = [array1 filteredArrayUsingPredicate:predicate];


Use NSMutableSet :

NSMutableSet *intersection = [NSMutableSet setWithArray:array1]; [intersection intersectSet:[NSSet setWithArray:array2]]; [intersection intersectSet:[NSSet setWithArray:array3]]; NSArray *array4 = [intersection allObjects];

El único problema con esto es que pierdes el orden de los elementos, pero creo (en este caso) que eso está bien.

Como se ha señalado en los comentarios (¡gracias, Q80 !), IOS 5 y OS X 10.7 agregaron una nueva clase llamada NSOrderedSet (con una subclase Mutable ) que le permite realizar estas mismas operaciones de intersección mientras mantiene el orden.


NSMutableArray *first = [[NSMutableArray alloc] initWithObjects:@"Jack", @"John", @"Daniel", @"Lisa",nil]; NSMutableArray *seconds =[[NSMutableArray alloc] initWithObjects:@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica",nil]; NSMutableArray *third = [ [ NSMutableArray alloc]init]; for (id obj in first) { if ([seconds containsObject:obj] ) { [third addObject:obj]; } } NSLog(@"third is : %@ /n/n",third);

SALIDA:

el tercero es:

Jack, Lisa

)