Compruebe si todos los objects en un NSArray son idénticos.

He buscado esto en Internet, pero no he encontrado ninguna solución …

Esto es lo que quiero:

Di que tengo un NSArray con tres objects. Estos tres objects son:

 { @"Hi", @"Hi", @"Hi" } 

En este caso, la matriz contiene tres cadenas, que son todas iguales.

Quiero testificar para esto, quiero crear un método BOOL categoría NSArray que recorra todos los objects y devuelva YES si todos son idénticos. Aquí hay un ejemplo:

 NSArray *array = [[NSArray alloc] initWithObjects: @"Object", @"Object", @"Object", nil]; if ([array allObjectsAreIdentical /* method I would have to create */) { NSLog(@"All objects in this array are identical"); } 

Estoy bastante seguro de que no hay un método incorporado para esto, y también preferiría no tomar la tediosa ruta y comparar manualmente cada object.

¡Gracias!

Qué pasa

 NSSet *set = [NSSet setWithArray:array]; if ([set count] == 0) { // array is empty. Does that count as identical ? } else if ([set count] == 1) { // all objects in array are identical } else { // there are different objects } 

EDIT: Escrito como método de categoría NSArray esto sería

 -(BOOL) allObjectsAreIdentical { NSSet *set = [NSSet setWithArray:self]; return ([set count] <= 1); } 

Nota: debe tener en count que esta solución (aunque parezca elegante) compara más objects de la matriz de lo necesario. Por lo tanto, si el performance es un problema, es mejor que vayas con otras soluciones, por ejemplo, la propuesta por @dieworld.

Más barato (espero) en términos de resources y time:

 - (BOOL) allObjectsAreIdentical { if (self.count < 2) return YES; for (int i = 0; i < self.count - 1; i++) { if (![[self objectAtIndex: i] isEqual: [self lastObject]]) return NO; } return YES; } 

Suponiendo que un object es siempre igual a sí mismo y que los objects cero también son iguales.

Sugerencia para ser un poco más rápido y evitar que se lance una exception cuando la matriz está vacía. Debe ser una categoría de NSArray para ser generalmente utilizable. Sin verificación a less que al less dos elementos. Compruebe los pointers de objects antes de llamar a isEqual :, suponiendo que los objects a menudo iguales sean en realidad el mismo object.

 @interface NSArray (objectsAreIdentical) - (BOOL)allObjectsAreIdentical; @end @implementation NSArray (objectsAreIdentical) - (BOOL)allObjectsAreIdentical { BOOL result = YES; if (self.count >= 2) { id firstObject = self [0]; for (id object in self) { if (firstObject != object && ! [firstObject isEqual:object]) { result = NO; break; } } } return result; } @end 

Mi propuesta sería (solo para dejarla aquí … por las dudas):

 - (BOOL)allObjectsAreIdenticalInArray:(NSArray *)mArray { if(!mArray || ![mArray count]) { return YES;//if it is empty } NSString *mTestString = [mArray objectAtIndex:0]; for(NSString *mString in mArray) { if(![mTestString isEqalToString:mString]) { return NO; //we found atleast one who isnt. } } return YES; //everything checks out - they all are the same. } 

Pero yo iría con la solución Martin R.