2011-05-16 11 views
39

que tengo tres NSMutableArray que contiene los nombres que se agregan a las listas de acuerdo a diferentes criterieas.Finding Intersección de NSMutableArrays

Aquí están mis matrices pseudocódigo:

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 gama que incluye la intersección de estas tres matrices. En este caso, por ejemplo, será:

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

Porque las tres matrices tienen jack y lisa como elemento. ¿Hay forma de simplemente hacer esto?

Respuesta

72

Uso 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 se pierde orden de los elementos, pero creo que (en este caso) que eso está bien.


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

+0

No obtengo nada de este código, ¿cómo es posible? – wagashi

+0

bueno esto funcionó para mí .. gracias – Leena

+0

Me preguntaba ¿cómo voy a intersectar estos 'NSMutableArray's si estos son matriz de objetos personalizados? por ejemplo: 'NSMutableArray * array1 = [obj1, obj2, obj3, obj4];' y así sucesivamente ... – thesummersign

2

Tenga una mirada en this post.

En pocas palabras: si se puede utilizar en lugar de NSSet NSArray, entonces es trivial (NSMutableSet tiene intersectSet:).

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

1
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:

tercera es: (

Jack, 

Lisa 

)

+0

esto no funciona en mi caso. – wagashi

-1

Aquí es una variante de trabajo de enlaces de arriba

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

Está usando su respuesta para intentar responder la pregunta y comentar otras respuestas. Actualice su respuesta para responder solo la pregunta y hacer un comentario sobre las respuestas adecuadas si desea responderlas. Tu respuesta es difícil de comprender por sí misma tal como es. –

0

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

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