iphone objective-c ios nsmutablearray

iphone - NSMutableArray comprueba si el objeto ya existe



objective-c ios (9)

No estoy seguro de cómo hacerlo. Tengo un NSMutableArray (addList) que contiene todos los elementos que se agregarán a mi fuente de datos NSMutableArray.

Ahora quiero verificar si el objeto que se agregará desde la matriz addList ya existe en la matriz de origen de datos. Si no existe, agregue el artículo, si existe, ignore.

Ambos objetos tienen una variable de cadena llamada iName que quiero comparar.

Aquí está mi fragmento de código

-(void)doneClicked{ for (Item *item in addList){ /* Here i want to loop through the datasource array */ for(Item *existingItem in appDelegate.list){ if([existingItem.iName isEqualToString:item.iName]){ // Do not add } else{ [appDelegate insertItem:item]; } } }

Pero encuentro el artículo que se agregará incluso si existe.

Qué estoy haciendo mal ?


¿Has indexOfObject: :?

-(void)doneClicked{ for (Item *item in addList){ if([appDelegate.list indexOfObject:item] == NSNotFound){ [appDelegate insertItem:item]; } }

ACTUALIZACIÓN: tiene un error lógico, no se equivoca en el código. supongamos que la primera matriz es [''a'', ''b'', ''c''], y la segunda es [''a'', ''x'', ''y'', ''z'']. Cuando iteras con ''a'' a través de la segunda matriz, no agregará ''a'' a la segunda matriz en la primera iteración (compara ''a'' con ''a'') pero agregará durante la segunda (compara ''a'' con ''x ''). Es por eso que debe implementar el método isEqual: (ver más abajo) en su objeto ''Artículo'' y usar el código anterior.

- (BOOL)isEqual:(id)anObject { if ([anObject isKindOfClass:[Item class]]) return ([self.iName isEqualToString:((Item *)anObject).iName]); else return NO; }


Compara el primer objeto del addList y el primer objeto de appDelegate.list, si no son iguales, insertas el objeto addList. La lógica es incorrecta, debe comparar un objeto de addList con cada objeto de appDelegate.list.


Convierte espacios en blanco en minúscula y recorte y luego verifica ...

[string lowercaseString];

y

NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];


Eche un vistazo a NSSet. Puede agregar objetos y el objeto solo se agregará si el objeto es único. Puede crear un NSSet desde un NSArray o viceversa.


Encontré una solución, puede que no sea la más eficiente de todas, pero al menos funciona

NSMutableArray *add=[[NSMutableArray alloc]init]; for (Item *item in addList){ if ([appDelegate.list containsObject:item]) {} else [add addObject:item]; }

Luego iterar sobre la matriz de agregar e insertar elementos.


Hay un método muy útil para esto en NSArray, es decir, containsObject .

NSArray *array; array = [NSArray arrayWithObjects: @"Nicola", @"Margherita", @"Luciano", @"Silvia", nil]; if ([array containsObject: @"Nicola"]) // YES { // Do something }


NR4TR dijo correctamente, pero creo que una declaración de interrupción es suficiente

if([existingItem.iName isEqualToString:item.iName]){ // Do not add break; }


Puede anular isEquals y hash en el objeto para que devuelva un SÍ / NO en función de la comparación de la propiedad iName.

Una vez que tienes eso, puedes usar ...

- (void)removeObjectsInArray:(NSArray *)otherArray

Para limpiar la lista antes de agregar todos los objetos restantes.


Use NSPredicate .

NSArray *list = [[appDelegate.list copy] autorelease]; for (Item *item in addList) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"iName MATCHES %@", item.iName]; NSArray *filteredArray = [list filteredArrayUsingPredicate:predicate]; if ([filteredArray count] > 0) [appDelegate insertItem:item]; }