Comment obtenir les clefs d'une collection de dictionaires ?

ClicCoolClicCool Membre
03:38 modifié dans API AppKit #1
Bonjour,
Ma bécane est au SAV et je n'ai pas les devTools sur le pbG3 qui me sert de secours.
Je poursuis néanmoins l'élaboration d'un projet ... sur papier avec un simple stylo (comme grand papa  :P )
Donc excusez moi si la réponse est évidente à  vos yeux.

Je souhaite obtenir une liste de toutes les clefs d'une série de dictionaires rangés dans un NSArray.
Il existe une instruction pour obtenir les clefs d'UN dictionaire.
MAis quelle est la meilleurs façon d'obtenir toutes les clefs de TOUS les dictionaires (sans doublons) ?

Merci :)

Réponses

  • 03:38 modifié #2
    Salut

    il suffit que tu créer un NSMutableArray :
    voici un exemple qui me permet de créer un popup à  partir d'un fichier .plist lu dans un Dictionary
    NSDictionary *content=[NSDictionary dictionaryWithContentsOfFile:thePath];
    if (nil!=content)
    {
    [thePopup removeAllItems];
    [thePopup addItemWithTitle:@";"];
    NSMutableArray *contentArray=[NSMutableArray arrayWithArray:[content allValues]];
    if (toSort){[contentArray sortUsingSelector: @selector( caseInsensitiveCompare: )];}
    for (i=0;i!=[content count];i++)
    {
    [thePopup addItemWithTitle:[contentArray objectAtIndex:i]];
    }
    }
  • ClicCoolClicCool Membre
    03:38 modifié #3
    Merci SpiderIncognito :)

    interressante ta méthode, je testerai (quand j'aurais ma bécane avec les devTool :'( )

    Mais je crois m'être très mal exprimmé.
    Ce n'est pas le contenu des dictionaires que je veux, c'est les clefs elles mêmes.

    Suposons une NSArray de dico représentant des contact (genre carnet d'adresse).
    Je souhaite, à  partir du NSArray connaitre toutes les clefs (champs) utilisés.

    Le premier dico peut ne contenir que des valeurs pour les clefs "nom", "prénom", "télephone"
    Un autre pour les clefs "nom", "prénom", "email"
    Un autre avec les valeurs pour seulement "nom", "adresse", "GSM"
    etc ...
    Et je souhaite me retrouver avec un NSArray contenant: "nom", "prénom", "téléphone", "GSM", "email", "adresse" ....

    Quelle est la méthode la plus élégante pour conaitre l'ensemble des clefs utilisées dans tous les dicos à  travers le NSArray.
    Peut-être demander au NSArray d'appliquer une méthode sur tous ses objets (dico) ? mais comment obtenir élégalement, un NSArray de clefs complet et sans doublons ?

    On peut peut-etre adresser un "allKeys" à  chaque dico, mais par quel algorythme en sortir une liste unique de toutes les clefs ?
  • 03:38 modifié #4
    un moyen plus rapide pour remplir le popup : [thePopup addItemsWithTitles:contentArray];

    pour les Keys tu as un message auquel sait répondre un Dictionary :

    NSArray *anArray=[NSArray arrayWithArray:[myDictionary allKeys]];

    pour le reste je n'y ai encore pas pensé , mais tu peux très bien faire une boucle avec un NSMutableArray qui teste le contenu de ton NSArray, voir s'il contient dans sa liste le contenu [NSArray objectAtIndex:index] et l'ajouter dans son propre tableau s'il n'existe pas.


  • mpergandmpergand Membre
    juillet 2004 modifié #5
    Salut ClicCool,

    Bon, je sais pas si ma solution est élégante :)  car c'est un peu zarbi cette histoire ;D, mais je ferai comme ça:

    NSMutableDictionary newDic
    pour tous les dics du NSArray
      pour toutes les entrées du dic
         newDic setObjectForkey           // si key existe -> change l'objet seulement

    et faire allKeys sur newDic et voilà  !

    [edit]

    mais en faisant:

    pour tous les dics
      newDic addEntriesfromDictionary

    peut-être que ça ne fait pas de double, comme pour setObjectForKey, mais  je n'ai jamais essayé ...
  • ClicCoolClicCool Membre
    03:38 modifié #6
    Ouiiiiiii !
    Merci Marc  :D
    L'idée est super, un dico ne duplique jamais ses entrées !
    Peut-être même que addEntriesFromDictionary est plus efficace encore !

    Bon j'essaie de cogiter ça sur papier, y'a peut-être moyen d'utiliser ça efficacement ...
    Et dès que j'ai ma bécane je vérifie la syntaxe et test ces idées.

    En plus maintenant j'ai d'autres idées pour les popups :)

    Je continue de cogiter tout ça ;)
  • mpergandmpergand Membre
    03:38 modifié #7
    Un test rapide avec addEntriesFromDictionary semble donner le résultat attendu  :)

    Donc il suffit de faire:
    <br />NSArray dicArray;<br />NSMutableDictionary newDic= new NSMutableDictionary();<br /><br />for(int i=0; i&lt;dicArray.count(); i++)<br />    newDic.addEntriesFromDictionary( (NSDictionary) dicArray.objectAtIndex(i);<br /><br />NSArray keys=newDic.allKeys();<br />
    


  • ClicCoolClicCool Membre
    03:38 modifié #8
    Tout à  fait :)

    Peut-être même est-il possible d'utiliser un
    1- NSArray makeObjectsPerformSelector:(SEL)aSelector withObject:(id)anObject
    2- ou sinon, il me semble que les bindings permettent d'adresser des messages plus fins et/ou complexes à  tous les objets d'un tableau

    On évite ainsi la boucle et récupére au final le Dico dont on extrait enfin toutes les clefs.

    Merci encore Marc :)

    PS vivement que je récupère l'accès aux DevTools. Le papier et le stylo ont l'avantage de forcer à  mieux structurer un projet avant le codage proprement dit, mais c'est difficile de structurer si on ne peut vérifier ce qu'il est possible de faire et comment le faire.
Connectez-vous ou Inscrivez-vous pour répondre.