2009-09-25 31 views
27

Tengo dos NSArrays, lo que quiero hacer es comparar dos matrices que contienen cadenas, encontrar las similitudes y crear la primera matriz de nuevo, pero no tienen similitudes.Comparación de dos matrices

Solo por un ejemplo algo así como.

dos matrices:

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil]; 
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil]; 

Resultado:

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil]; 

NSArray *arrayOneCopy = [NSArray arrayWithObjects:@"TD1", @"TD3", nil]; 
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil]; 

Respuesta

56
NSMutableArray *arrayOneCopy = [NSMutableArray arrayWithArray:arrayOne]; 
[arrayOneCopy removeObjectsInArray:arrayTwo]; 
28

Uso NSMutableSet:

NSMutableSet *setOne = [NSMutableSet setWithArray: arrayOne]; 
NSMutableSet *setTwo = [NSMutableSet setWithArray: arrayTwo]; 

[setOne minusSet: setTwo]; 

NSArray *arrayOneResult = [setOne allObjects]; 

(estrictamente hablando, setTwo no tiene que ser mutable, puede también sea un NSSet (que funciona mejor))

O use NSArray como respondió la otra persona, eso también funciona.

El que funcione depende completamente del tamaño del conjunto de datos. Para pequeños conjuntos de datos, la solución de matriz funciona bien. Para conjuntos más grandes, NSSet será mucho más eficiente ya que las pruebas de membresía son una comprobación de hash y no una búsqueda lineal.

Mida y use la que mejor funcione.

+0

Si el orden de los elementos de la matriz es importante, entonces creo que habría que utilizar el otra solución con NSArray, ¿verdad? –

+0

Buena respuesta, pero como dijo, solo estoy usando pequeños conjuntos de datos, así que voy a usar la otra solución. ¡Gracias de cualquier manera! – Joshua

+0

Sí, para pequeños conjuntos de datos, la respuesta de "newacct" es el camino a seguir. – bbum

3
- (NSInteger)countOfDifferentObjects:(NSArray *)anotherArray { 

    NSSet * s = [NSSet setWithArray:self]; 
    NSMutableSet * s1 = [NSMutableSet setWithSet:s]; 
    NSSet * s2 = [NSSet setWithArray:anotherArray]; 

    [s1 unionSet:s2]; 
    [s1 minusSet:s]; 
    return [s1 count]; 
} 

Esto devuelve el número de diferentes objetos entre dos matrices (la comparación es con IsEqual)

array1 = @"A", @"B", @"C" 
array2 = @"B", @"D", @"Z" 
returns 2 (D and Z are different)