objective-c cocoa cocoa-touch nsarray subtraction

objective c - Restar objetos en un NSArray de otra matriz



objective-c cocoa (5)

¿Algo como esto?

NSMutableArray *array = [NSMutableArray arrayWithArray:wants]; [array removeObjectsInArray:needs];

Tengo dos NSArrays:

NSArray *wants = [NSArray arrayWithObjects: @"apples", @"oranges", @"pineapple", @"mango", @"strawberries", nil]; NSArray *needs = [NSArray arrayWithObjects: @"apples", @"pineapple", @"strawberries", nil];

Y quiero XOR ellos. Algo así como wants - needs para que lo que me queda sea

[NSArray arrayWithObjects: @"oranges", @"mango", nil];

Normalmente pasaría por un bucle pesado, pero estoy seguro de que hay una forma más práctica. ¿Qué debería hacer?


¿Qué tal usar predicados?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", needs]; NSArray *wants_needs = [wants filteredArrayUsingPredicate:predicate];


Dadas dos suposiciones: que el orden no es importante (o puede restaurarse, por ejemplo, si las matrices están ordenadas ahora) * y que ningún elemento aparece más de una vez en ninguna matriz (aunque puede usar un conjunto contado para esto), una establecer podría ser una buena opción.

El XOR (estrictamente, la diferencia simétrica) de dos conjuntos es la unión menos la intersección:

NSMutableSet * unioned = [NSMutableSet setWithArray:wants]; [unioned unionSet:[NSSet setWithArray:needs]]; NSMutableSet * intersection = [NSMutableSet setWithArray:needs]; [intersection intersectSet:[NSSet setWithArray:wants]]; [unioned minusSet:intersection];

* Si el orden es importante, puede usar NSOrderedSet .


La respuesta de Kirby está bien, pero: si no te importa el orden de los elementos en las matrices, deberías usar conjuntos en su lugar. Si el pedido es importante, puede considerar NSOrderedSet . Puede usar el -minusSet: o, para este último, -minusOrderedSet: métodos.


Prueba esto:

NSArray *NSArray_XOR(NSArray *arr1, NSArray *arr2) { NSMutableArray *results = [NSMutableArray array]; for (int i = 0; i < arr1.count; i++) { id obj = [arr1 objectAtIndex:i]; if (![arr2 containsObject:obj]) [results addObject:obj]; } for (int i = 0; i < arr2.count; i++) { id obj = [arr2 objectAtIndex:i]; if (![arr1 containsObject:obj]) [results addObject:obj]; } // make a unmutable copy of the array. return [NSArray arrayWithArray:results]; }