web-dev-qa-db-fra.com

NSMutableArray vérifie si l'objet existe déjà

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 ?

42
Neelesh

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.

39
Neelesh

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
}
72
Black Tiger

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];
}
22
EmptyStack

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;
}
5
knuku

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.

4
Charged Neuron

NR4TR a dit correctement mais je pense qu'un break est suffisant


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

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.

2
Simon Lee

Convertissez les espaces minuscules et rognés, puis cochez.

[string lowercaseString];  

et

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

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.

1
Terence