2009-10-30 12 views
21

posible duplicado: comparing-two-arraysObjective-C - ¿Cómo comparar matrices y extraer la diferencia?

Tengo dos NSArray y me gustaría crear una nueva matriz con los objetos de la segunda matriz, pero no incluido en la primera matriz.

Example: 

NSMutableArray *firstArray = [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil]; 
NSMutableArray *secondArray = [NSMutableArray arrayWithObjects:@"Bill", @"Paul", nil]; 

The resulting array should be: 

[@"Paul", nil]; 

Resolví este problema con un bucle doble comparando objetos en el interior.

¿Hay mejores soluciones?

Respuesta

93
[secondArray removeObjectsInArray:firstArray]; 

Esta idea fue tomada de another answer.

10

Si los elementos duplicados son no significativo en las matrices, puede utilizar la operación de minusSet:NSMutableSet:

NSMutableArray *firstArray = [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil]; 
NSMutableArray *secondArray = [NSMutableArray arrayWithObjects:@"Bill", @"Paul", nil]; 

NSSet *firstSet = [NSSet setWithArray:firstArray]; 
NSMutableSet *secondSet = [NSMutableSet setWithCapacity:[secondArray count]]; 
[secondSet addObjectsFromArray:secondArray]; 

[secondSet minusSet:firstSet]; // result is in `secondSet` 
+2

Esto es imposible. Los documentos de Apple dicen que minusSet es de tipo nulo. – Adam

+2

el código correcto para la última declaración es simplemente "[secondSet minusSet: firstSet];" que realiza la resta El resultado no se devuelve, sino que es una operación en el objeto secondSet. Si esto está en una subrutina, entonces "devolvería secondSet"; –

0

Quiero comparar imágenes de dos NSArray. One Array, obtenía de Core Database. Segundo, tengo objetos de matriz constante.

Quiero saber que el objeto de la segunda matriz está presente en la base de datos Core o no.

Aquí está el código que utilicé.

// All object from core data and take into array. 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"student"]; 

NSArray *dbresult = [[NSArray alloc]init]; 
NSError *error; 
@try { 
    dbresult = [context executeFetchRequest:fetchRequest error:&error]; 
} 
@catch (NSException *exception) { 
    NSString *logerror = [NSString stringWithFormat:@"error in fetching Rooms from coredata = %@",exception.description]; 
NSLog(logerror) 
} 
@finally { 
} 

/* 
Get Unused images from list 
*/ 

NSMutableArray *usedImages = [dbresult valueForKey:@"roomImageLocalPath"]; 

NSMutableSet *fSet = [NSMutableSet setWithArray:usedImages]; 
NSMutableSet *sSet = [NSMutableSet setWithCapacity:[newImages count]]; 
[sSet addObjectsFromArray:newImages]; 
[sSet minusSet:fSet]; 

NSArray *unusedImages = [secondSet allObjects]; 
NSLog(@"unusedImages %@",unusedImages); 
Cuestiones relacionadas