Je ne sais pas trop comment procéder. J'ai un NSMutableArray (addList) qui contient tous les éléments à ajouter à ma source de données NSMutableArray.
Je veux maintenant vérifier si l'objet à ajouter à partir du tableau addList existe déjà dans le tableau source de données. S'il n'existe pas, ajoutez l'élément, s'il existe, ignorez-le.
Les deux objets ont une variable chaîne appelée iName que je veux comparer.
Voici mon extrait de code
-(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];
}
}
}
Mais je trouve l'article à ajouter même s'il existe.
Qu'est-ce que je fais mal ?
J'ai trouvé une solution, peut-être pas la plus efficace de toutes, mais au moins ça marche
NSMutableArray *add=[[NSMutableArray alloc]init];
for (Item *item in addList){
if ([appDelegate.list containsObject:item])
{}
else
[add addObject:item];
}
Ensuite, j'itère le tableau d'ajout et j'insère des éléments.
Il existe une méthode très utile pour cela dans NSArray, c'est-à-dire containsObject.
NSArray *array;
array = [NSArray arrayWithObjects: @"Nicola", @"Margherita", @"Luciano", @"Silvia", nil];
if ([array containsObject: @"Nicola"]) // YES
{
// Do something
}
Utilisez 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];
}
As-tu essayé indexOfObject:
?
-(void)doneClicked{
for (Item *item in addList){
if([appDelegate.list indexOfObject:item] == NSNotFound){
[appDelegate insertItem:item];
}
}
MISE À JOUR: Vous avez une erreur logique, pas une erreur de code. supposons que le premier tableau est ['a', 'b', 'c'] et le second est ['a', 'x', 'y', 'z']. Lorsque vous itérez avec "a" dans le deuxième tableau, il n'ajoutera pas "a" au deuxième tableau lors de la première itération (comparez "a" avec "a") mais ajoutera pendant la seconde (comparez "a" avec "x"). '). C'est pourquoi vous devez implémenter isEqual:
(voir ci-dessous) dans votre objet 'Item' et utilisez le code ci-dessus.
- (BOOL)isEqual:(id)anObject {
if ([anObject isKindOfClass:[Item class]])
return ([self.iName isEqualToString:((Item *)anObject).iName]);
else
return NO;
}
Jetez un œil à NSSet. Vous pouvez ajouter des objets et l'objet ne sera ajouté que si l'objet est unique. Vous pouvez créer un NSSet à partir d'un NSArray ou vice versa.
NR4TR a dit correctement mais je pense qu'un break est suffisant
if([existingItem.iName isEqualToString:item.iName]){
// Do not add
break;
}
Vous pouvez remplacer isEquals
et hash
sur l'objet afin qu'il renvoie un OUI/NON basé sur la comparaison de la propriété iName.
Une fois que vous l'avez, vous pouvez l'utiliser ...
- (void)removeObjectsInArray:(NSArray *)otherArray
Pour nettoyer la liste avant d'ajouter tous les objets restants.
Convertissez les espaces minuscules et rognés, puis cochez.
[string lowercaseString];
et
NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
Vous comparez le premier objet de addList et le premier objet de appDelegate.list, s'ils ne sont pas égaux, vous insérez l'objet de addList. La logique est erronée, vous devez comparer un objet addList avec chaque objet appDelegate.list.