Quelle est la meilleure méthode pour dédoubler les objets d'un array ?
muqaddar
Administrateur
Salut,
Depuis que je fais du cocoa, je cherche parfois à dédoubler les objets identiques d'un array.
Mais j'ai jamais trouvé de méthode efficace et courte.
Imaginons un array de dicos avec des clés string identiques (cad des objets dico qui contiennent des clés name de même valeur).
J'ai souvent du employer deux enumerators imbriqués, mais je trouve pas ça GLOP.
Vous faites comment vous ?
EDIT :
En fait, dans mon cas, il s'agit plutôt de ne pas ajouter d'objets déjà présents dans l'array.
Depuis que je fais du cocoa, je cherche parfois à dédoubler les objets identiques d'un array.
Mais j'ai jamais trouvé de méthode efficace et courte.
Imaginons un array de dicos avec des clés string identiques (cad des objets dico qui contiennent des clés name de même valeur).
J'ai souvent du employer deux enumerators imbriqués, mais je trouve pas ça GLOP.
Vous faites comment vous ?
EDIT :
En fait, dans mon cas, il s'agit plutôt de ne pas ajouter d'objets déjà présents dans l'array.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu veux faire quoi, au juste, avec ce tableau ? En fait, je me demande si ta structure de données (tableau de dicos, mais contrainte sur le nom d'une clef) est adaptée à ce que tu veux représenter.
+
Chacha
Oh, c'est tout simple, je ne veux pas ajouter un dico dont la valeur d'une des clés serait déjà présente dans les autres dicos de cet array.
Je trouve cette contrainte étrange... dans une base de données, il y aurait une histoire de clef primaire ou étrangère, non ?
Sinon tu as la possibilité suivante, mais ça ressemble à du bricolage
+
Chacha
Je voulais comparer le contenu et nom les clés. ;-)
Mais avec containsObject, je m'en suis sorti. :-)
merci
Par exemple j'ai un tableau "NSArray* tab" de dictionaires, chaque dico contenant les clés {nom,contenu}, avec la clé "nom" agissant comme clé primaire (unique, caractéristique de l'objet).
Et bien pour savoir si dans mon tableau j'ai un élément qui a pour nom "nom_unique", je fais donc [tt]BOOL idExists = [[tab valueForKey:@nom] containsObject:@nom_unique];[/tt]
Pas besoin d'énumérateur avec le KVC
Tiens, c'est bizarre, je n'avais pas compris que le KVC (Key-Value Coding pour ceux qui ne savent pas - c'est expliqué dans la doc d'Apple) marchait comme ça. Comment ça se fait que ça fonctionne ? Pour moi, il s'agit de récupérer la valeur d'une donnée d'instance à partir de son nom (ou de son chemin), mais là , "nom" n'est pas lun chemin correct ?!
+
Chacha
C'est fort ! Mais comment le système sous-jacent fait-il la différence entre un conteneur et un non-conteneur ? Il y a sous-classement de la méthode "valueForKey" dans les conteneurs de Cocoa ?
+
Chacha
Maintenant il y a plus fort: si tu as une relation to-many (à laquelle tu veux accéder avec la clés things), mais que tu ne veux pas la stocker sous forme de tableau, parce que par exemple le dit tableau existe ailleurs et qu'il est inutile de le dupliquer, tu déclares et implémentes les méthodes -(unsigned int)countOfThings; et - (aClass*)objectInThingsAtIndex:(unsigned int)index (ces méthodes font chercher les éléments dans l'autre tableau). Comme ça si tu fais [anObject valueForKey:@things];, ça crée et renvoie un tableau contenant les bons éléments.
Décidément, Cocoa me surprend encore...