Quelle est la meilleure méthode pour dédoubler les objets d'un array ?

muqaddarmuqaddar Administrateur
janvier 2006 modifié dans API AppKit #1
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.

Réponses

  • ChachaChacha Membre
    janvier 2006 modifié #2
    je n'ai pas compris la question...
    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
  • muqaddarmuqaddar Administrateur
    12:45 modifié #3
    dans 1136802319:

    je n'ai pas compris la question...
    Tu veux faire quoi, au juste, avec ce tableau ?


    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.
  • ChachaChacha Membre
    12:45 modifié #4
    dans 1136802518:

    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
    <br />//on choppe toutes les clefs présentes dans le tableau<br />NSMutableArray* allKeysOfAllObjects = [NSMutableArray array];<br />NSEnumerator* enumerator = [monTab objectEnumerator];<br />NSDictionary* dict = nil;<br />while((dict = [enumerator&nbsp; nextObject]))<br />&nbsp; [allKeysOfAllObjects addObjectsFromArray:[dict allKeys]];<br /><br />//maintenant tu peux tester si ta clef existe déjà ...<br />//je transforme le NSArray en NSSet pour accélérer la recherche (utile s&#39;il y en a plusieurs successives)<br />NSSet* allKeysOfAllObjectsAsSet = [NSSet setWithArray:allKeysOfAllObjects];<br />if ([allKeysOfAllObjectsAsSet&nbsp; containsObject:laClefATester])<br /> ...<br />
    


    +
    Chacha
  • muqaddarmuqaddar Administrateur
    12:45 modifié #5
    Bon, c'était pas tout à  fait ma demande, mais tu m'as mis sur la voie...
    Je voulais comparer le contenu et nom les clés. ;-)

    Mais avec containsObject, je m'en suis sorti. :-)
    merci
  • AliGatorAliGator Membre, Modérateur
    janvier 2006 modifié #6
    Moi quand j'ai un array de dicos, et que chaque dico a la même tronche, je fais un "valueForKey:" directement sur mon NSArray, ce qui encoie ce message à  chaque élément de mon NSArray... donc à  chaque dictionary que contient mon NSArray.

    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 :o
  • ChachaChacha Membre
    12:45 modifié #7
    dans 1136805189:

    Moi quand j'ai un array de dicos, et que chaque dico a la même tronche, je fais un "valueForKey:" directement sur mon NSArray, ce qui encoie ce message à  chaque élément de mon NSArray... donc à  chaque dictionary que contient mon NSArray.

    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
  • 12:45 modifié #8
    Dans le cas des accès à  des variables d'instances ou des relations "to-one", le KVC marche comme tu l'entends. Mais lorsque du "to-many" est impliqué (comme c'est le cas avec un tableau, et non avec un dico), valueForKey: doit renvoyer un tableau contenant les valeurs associées à  la clé des différents éléments contenus dans le tableau.
  • ChachaChacha Membre
    12:45 modifié #9
    dans 1136814879:

    Dans le cas des accès à  des variables d'instances ou des relations "to-one", le KVC marche comme tu l'entends. Mais lorsque du "to-many" est impliqué (comme c'est le cas avec un tableau, et non avec un dico), valueForKey: doit renvoyer un tableau contenant les valeurs associées à  la clé des différents éléments contenus dans le tableau.

    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
  • 12:45 modifié #10
    C'est de cette manière qu'a été implémentée valueForKey: dans les tableaux.

    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.
  • ChachaChacha Membre
    12:45 modifié #11
    Merci pour ces explications !
    Décidément, Cocoa me surprend encore...
Connectez-vous ou Inscrivez-vous pour répondre.