Cómo comparar 2 nsarray

Tengo 2 Nsarray donde los objects de 2 arrays son los mismos que pueden ser los índices del object, pero debe ser ambos iguales independientemente de los índices.

NSArray *arr1 = [[NSArray alloc]initWithObjects:@"aa",@"bb",@"1",@"cc", nil]; NSArray *arr2 = [[NSArray alloc]initWithObjects:@"bb",@"cc",@"1",@"aa", nil]; if([arr1 isEqualToArray:arr2]) { NSLog(@"equal"); } else { NSLog(@"Not equal"); } 

el código anterior está imprimiendo 'No es igual' pero debería imprimir 'igual' ¿Cómo puedo hacer esto?

Esos dos arreglos no son iguales. Dos matrices son iguales es que ambos tienen los mismos objects en el mismo order.

Si desea comparar sin tener en count el order, debe usar dos objects NSSet .

 NSSet *set1 = [NSSet setWithArray:arr1]; NSSet *set2 = [NSSet setWithArray:arr2]; if ([set1 isEqualToSet:set2]) { // equal } 

Prueba esto. Lo que estoy haciendo es hacer una copy de su primera matriz y eliminar elementos de copy de la segunda matriz. Si está vacío, entonces es igual, de lo contrario no es igual.

Tiene una huella de memory menor que la solución @rmaddy. Usted crea un duplicado de una sola matriz, no ambas, las matrices …

 NSMutableArray *copyArray; if([arr1 count] >= [arr2 count]) { copyArray = [NSMutableArray arrayWithArray:arr1]; [copyArray removeObjectsInArray:arr2]; } else //c(arr2) > c(arr1) { copyArray = [NSMutableArray arrayWithArray:arr2]; [copyArray removeObjectsInArray:arr1]; } if([copyArray count] != 0) NSLog('Not Equal'); else NSLog('Equal'); 

ACTUALIZACIÓN1: Si quiere usar arr2 después de esto, entonces se modificó. Necesita hacer una copy, entonces, en ese caso, la memory es lo mismo que la solución de Rmaddy. Pero aún así esta solución es superior ya que, el time de creación de NSSet es mucho más que NSArray – fuente .

UPDATE2: actualizado para hacer la respuesta más completa en caso de que una matriz sea más grande que otra.

La mayoría de las respuestas aquí no funcionan para casos bastante comunes (ver sus comentarios). Existe una muy buena estructura de datos que resolverá este problema: NSCountedSet .

El set contado no está orderado, pero se preocupa por la cantidad de elementos presentes, por lo que no termina con @[1, @1, @2] == @[@1, @2, @2] .

 NSArray *array1 = @[@1, @1, @2]; NSArray *array2 = @[@1, @2, @2]; NSCountedSet *set1 = [[NSCountedSet alloc] initWithArray:array1]; NSCountedSet *set2 = [[NSCountedSet alloc] initWithArray:array2]; BOOL isEqual = [set1 isEqualToSet:set2]; NSLog(@"isEqual:%d", isEqual); 

Al igual que Rmaddy dijo, esos NSArrays no son iguales. Prueba esto:

 -(BOOL)compareArrayIgnoreIndexes:(NSArray*)arrayOne toArray:(NSArray*)arrayTwo{ NSSet *setOne=[[NSSet alloc]initWithArray:arrayOne]; NSSet *setTwo=[[NSSet alloc]initWithArray:arrayTwo]; return [setOne isEqualToSet:setTwo]; } 

Encontré la solución, podemos lograrlo clasificando los elementos de la matriz

  NSArray *arr1 = [[NSArray alloc]initWithObjects:@"a2223a",@"ab33b",@"a1acdf",@"ac23c45", nil]; NSArray *arr11 = [arr1 sortedArrayUsingSelector:@selector(localizedCompare:)]; NSArray *arr2 = [[NSArray alloc]initWithObjects:@"ab33b",@"ac23c45",@"a1acdf",@"a2223a", nil]; NSArray *arr22= [arr2 sortedArrayUsingSelector:@selector(localizedCompare:)]; if([arr11 isEqualToArray:arr22]) { NSLog(@"equal"); } else { NSLog(@"Not equal"); } 
 This can be done by using one NSMutableArray.The main point to be remembenetworking is that the larger array should be saved in NSMutableArray. Otherwise it wont work as expected. The code is given below. NSArray *array1 = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]; NSArray *array2 = [NSArray arrayWithObjects:@"Two", @"Three", @"One", nil]; NSMutableArray *intermediate = [NSMutableArray arrayWithArray:array1]; [intermediate removeObjectsInArray:array2]; NSUInteger difference = [intermediate count];//returns the number of difference between two arrays. 

Otra opción es convertir los NSArrays en cadenas JSON, y comparar usando isEqualToString.

 -(BOOL)isArray:(NSArray *)firstArray equalContentsToArray:(NSArray *)secondArray { if (!firstArray) { firstArray=@[]; } if (!secondArray) { secondArray=@[]; } NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:firstArray options:0 error:&error]; NSString *jsonStringOne = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; jsonData = [NSJSONSerialization dataWithJSONObject:secondArray options:0 error:&error]; NSString *jsonStringTwo = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; BOOL isEqual=NO; if ([jsonStringOne isEqualToString:jsonStringTwo]) { isEqual=YES; } return isEqual; } 

Sería curioso en cuanto a una comparación de performance de todos estos methods.