2010-03-27 17 views
0

J'ai un tableau mutable qui contient des dictionnaires mutables avec des chaînes pour les clés latitude, longitude et id. Certaines des valeurs de latitude et de longitude sont les mêmes et je veux supprimer les doublons du tableau afin que je n'ai qu'un seul objet par emplacement. Je peux énumérer mon tableau et en utilisant une deuxième énumération examiner chaque objet pour trouver des objets qui ont des identifiants différents, mais la même latitude et la longitude, mais si j'essaie de supprimer l'objet, je mute le tableau pendant l'énumération.Cocoa - Enumerate array mutable, suppression d'objets

Existe-t-il un moyen de supprimer des objets d'un tableau lors d'une énumération afin d'énumérer uniquement l'ensemble actuel d'objets lors de la mise à jour du tableau?

Espérons que cette question a du sens.

Merci, Howie

Répondre

5

Nombre jusqu'à une variable d'index que vous énumérez. Lorsque vous trouvez un dictionnaire que vous souhaitez supprimer, ajoutez son index à un mutable index set. Ensuite, lorsque vous avez fini d'énumérer, envoyez le tableau a removeObjectsAtIndexes: message, en passant l'ensemble d'index. L'autre solution consisterait à créer un deuxième tableau, puis à envoyer un message setArray: au premier tableau, en passant le second tableau ou en relâchant le premier, en conservant le second et en définissant le second en tant que nouveau premier.

Sur une note non liée, vous pouvez envisager de remplacer les dictionnaires par model objects. Il tend à faire du code plus propre.

+0

Merci pour les conseils - j'ai essayé quelque chose comme ça, mais il y a un problème. Si je suis sur l'index 3 et que je trouve qu'il a le même emplacement que l'index 4, j'ajouterais l'index 4 au tableau "à supprimer". Lorsque je boucle en boucle pour l'itération suivante, je veux que l'objet à l'index 4 soit ignoré car je sais déjà qu'il s'agit d'un doublon. Existe-t-il un moyen de supprimer des objets de la matrice d'origine que j'énumère ou en utilisant une autre méthode de bouclage? – Ward

+0

Ward, aucune des méthodes suggérées par Peter n'a le problème que vous décrivez. Néanmoins, il existe un moyen simple de l'éviter si vous voulez faire les choses manuellement: parcourir les objets à supprimer de l'index le plus haut vers le plus bas. –

+0

Ward: Non, vous ne pouvez pas muter le tableau pendant que vous l'énumérez. Cela provoquera une exception Cocoa. Vous devez soit le faire muter ou le remplacer * après * la boucle, soit faire une boucle sur une copie. Je recommande la solution 'removeObjectsAtIndexes:'. –

2

En fait vous pouvez. Vous devez aller de l'index en haut à 0. Essayez ceci:

for (int i = [mutableArray count] -1; i >=0; i--) { 
    id yourObject = [mutableArray objectAtIndex: i]; 
    BOOL needToDelete; 
    // place you conditions here... 

    if (needToDelete) { 
     [mutableArray removeObject: yourObject]; 
    } 
} 
+0

Puis-je utiliser reverseObjectEnumerator pour cela? – Vyacheslav

+0

Oui, vous pouvez. Je viens de le tester avec reverseObjectEnumerator et ça marche très bien. –