Comment obtenir les clefs d'une collection de dictionaires ?
ClicCool
Membre
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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]];
}
}
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 ?
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.
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é ...
Merci MarcÂ
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
Donc il suffit de faire:
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.