Optimisation: Eviter 2 boucles imbriquées?
NiClou
Membre
Salut à tous,
Aujourd'hui je ne vais pas poser de problèmes quoi que... ::)
C'est plus un cas d'école qu'autre chose.
Je voudrais optimiser mon code suivant:
for (NSString* memberId in members){
for (Member* member in self.arrayOfMembers) {
if ([member.memberId isEqualToString:memberId]) {
if ([member isEqual:self.currentConnected])
[self action];
[self.arrayOfMembers removeObject:member];
}
}
}
Ma méthode reçoit un array de string members, et j'ai 2 variable d'instance:
- arrayOfMembers
- currentConnected (string)
Le but étant d'éviter les boucles imbriquées (entre autres).
Voilà , Merci d'avance pour vos conseils et astuce
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Plutôt que [self.arrayOfMembers removeObject:member], qui modifie l'objet self.arrayOfMembers sur laquelle ta boucle for est en train d'itérer, moi je prévoirais plutôt un NSMutableArray objectsToRemove avant la boucle for, j'ajouterais member à objectsToRemove dans le if à la place du removeObject, et je ferais un "removeObjects:" à la fin de la boucle.
Pour la lisibilité dans ta boucle (oui, ce n'est pas la demande principale des deux boucles imbriquées )
Tu sais que je fais l'erreur à chaque fois <_<
Et après je m'étonne d'avoir des crash -_-
Merci Ali de me l'avoir fait remarquer avant mes test ^^'
... je découvre... même si ça paraà®t logique.
Jusqu'à maintenant, je m'y suis prise en utilisant une boucle for.... à l'envers...
Ce n'est peut-être pas très clean ?
Une autre solution est de ne pas utiliser la fast enumeration, non ?
Et en plus cela oblige à recalculer [self.arrayOfMembers count] à chaque itération
Je préfère la méthode de Booleanne de faire une itération à l'envers, c'est plus lisible et plus optimal.
PS : J'ai mis dans mon post plus haut que c'était "déconseillé" de modifier un objet mutable pendant sa propre itération... je dirais même que c'est interdit. Normalement quand on utilise la syntaxe de NSFastEnumeration (enumerateObjects...), on a une exception explicite disant "can't modify a mutable object while enumerating on it" un truc comme ça. Qu'on a pas quand on fait une boucle for indicée.
Ce n'est pas parfait non plus, je te l'accorde, mais ça a l'avantage de la compacité.
Je trouve ta version avec NSMutableArray objectsToRemove un peu longue pour le coup, comme quoi
Pour le meilleur rapport : qualité/masse de travail, je me débrouille plutôt pas trop mal... Je suis très économe dans ce domaine.... plus je pense, et moins j'en fais... ou l'éloge de la paresse
Donc il y en a une première pour avoir directement les indices des objets qui passent un certain test, ça peut déjà être une première solution : Et sinon demander directement de filtrer peut en être une autre, avec la méthode filterUsingPredicate : Bref, c'est pas les solutions qui manquent