itinerer dans une collection pour supprimer des elements

cyranocyrano Membre
février 2011 modifié dans Objective-C, Swift, C, C++ #1
bonjour,

j'ai un doute sur ma soluce.

pseudo-code

soit un NSMutableArray *requests

.../...

volatile int nRequests = [requests count];

for(int iRequest = 0; iRequest<nRequests; iRequest++) {

BC_Request *request = [requests objectAtIndex:iRequest];

if(condition pour suppression) {

[requests removeObject:request];
nRequests--;
iRequest--;
}

}

ca semble crade?

y-a t'il une forme canonique?

Réponses

  • LexxisLexxis Membre
    21:02 modifié #2
    Bonjour,
    Il serait plus prudent soit de créer un autre NSMutableArray dans lequel tu insères les éléments à  supprimer puis à  la sorti de la boucle tu appelle la méthode - (void)removeObjectsInArray:(NSArray *)otherArray sur 'requests'. Ou tu conserves les index des éléments à  supprimer dans un NSIndexSet et de même tu appelle - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes.

    Il est toujours dangereux de modifier les éléments d'un tableau dans une boucle d'itération.
  • chkdskschkdsks Membre
    février 2011 modifié #3
    Pourquoi volatile ?

    Il y a bien les Fast Enumerations qui ont une syntaxe moins lourde mais elles ne sont pas faites pour que le NSMutableArray soit changé en cours de route...

    Lien documentation : Fast Enumeration

    Donc personnellement je fais une Array intermédiaire comme a dit Lexxis, grâce à  une Fast Enumeration (et là  on peut).
  • tabliertablier Membre
    21:02 modifié #4
    Pour faire ce genre d'opération, j'utilise:
    NSMutableArray *liste;
    int x;
    // ici remplissage de liste.

    for (x=[liste count]-1 ; x>=0 ; x--)
        if ([liste objectAtIndex:x] == (condition suppression))
      [liste removeObjectAtIndex:x] ;
    ça marche tout seul!
  • AliGatorAliGator Membre, Modérateur
    21:02 modifié #5
    méthode filteredArrayUsingPredicate: de NSArray
  • chkdskschkdsks Membre
    21:02 modifié #6
    Vous croyez qu'il va s'y retrouver ? lol
  • cyranocyrano Membre
    21:02 modifié #7
    Vous croyez qu'il va s'y retrouver ? lol


    :D, pas de probleme.

    Merci pour tout. il faut que j'arrete de coder a 2h du mat  :D
Connectez-vous ou Inscrivez-vous pour répondre.