Ajout dans un dictionnaire

KixxxKixxx Membre
janvier 2012 modifié dans Apple Developer Programs #1
Bonjour,



Je reviens vers vous, parce que j'aimerai mieux comprendre le processus d'ajout d'objets dans un dictionnaire.

Ce que je vais essayer de vous expliquer est difficile à  expliquer ^^, je me lance donc en vous fournissant directement un exemple.



Voilà , j'ai deux tableaux, un tableau de NSString et un tableau de NSArray (donc un tableau de tableau ^^)


Tableau de NSString contient :

- Feb 2012

- Jan 2012

- Dec 2011

- Oct 2011



Tableau de NSArray contient :

- {

OperationObject1

OperationObject2

}

- {

OperationObject3

OperationObject4

}

- {

OperationObject5

OperationObject6

}

- {

OperationObject7

OperationObject8

}




Ensuite, j'instancie donc un NSDictionary comme ceci :


NSDictionary *aDic = [NSDictionary dictionaryWithObjects:TableauDeTableaux forKeys:TableauDeString]




Mais le problème, c'est que j'aimerai garder l'ordre de mon tableau de NSString. Alors que si je fais un log sur mon dictionnaire, il va m'afficher quelques choses comme ça :




"Dec 2011" = (

OperationObject5

OperationObject6

);

"Feb 2012" = (

OperationObject1

OperationObject2

);

"Jan 2012" = (

OperationObject3

OperationObject4

);

"Oct 2011" = (

OperationObject7

OperationObject8

);




Et si j'essaye d'afficher la clé à  l'index 0 (donc la première clé), il va m'affiché :
Oct 2011




Bref, en gros je voudrais garder l'ordre de mes deux précédents tableaux.

Explications, solutions, idées, n'hésitez pas ^^ !

Par avance, merci.



Cordialement, Kévin.

Réponses

  • Hello,

    Au lieu de passer par [NSDictionary dictionaryWithObjects:], tu peux créer un NSMutableDictionnary et le remplir "à  la main"
  • 'Buno' a écrit:


    Hello,

    Au lieu de passer par [NSDictionary dictionaryWithObjects:], tu peux créer un NSMutableDictionnary et le remplir "à  la main"




    C'est ce que j'ai fais au départ, et c'est la même chose ! Le dictionnaire n'est pas constitué dans le bon ordre...
  • Ah oui, mais attends. L'intérêt d'un dictionnaire, c'est d'y accéder à  l'aide de la clé, et non de son index.

    Donc il ne garantit pas l'ordre des items image/wink.png' class='bbc_emoticon' alt=';)' />
  • AliGatorAliGator Membre, Modérateur
    janvier 2012 modifié #5
    C'est normal. Un NSDictionary est un dictionnaire. Quel que soit le langage de programmation et le framework, utilisé, en programmation un dictionnaire, parfois aussi appelé table de hachage (HashTable), n'est pas trié.



    C'est juste un truc qui associe des valeurs à  des clés, de sorte que tu puisses retrouver une valeur associée à  une clé dans un temps fixe quel que soit le nombre de clés et de valeurs. Les clés ne sont donc pas triés, par définition d'un dictionnaire.



    Les solutions du coup dépendent un peu de comment tu comptes utiliser ces données :



    1) Si tu comptes lire ton tableau de clés ("Oct 2011", "Dec 2011", etc) dans un ordre séquentiel, et n'a jamais besoin d'accéder à  une valeur donnée (associée à  ce mois) de manière "random" -- ou que si c'est le cas c'est assez rare et que tu n'auras pas des 100 et des 1000 entrées -- alors tu peux imaginer un NSArray d'objets "Mois" (classe perso que tu crées), classe qui aura une propriété "nom" de type NSString ("Oct 2011" par exemple) et une propriété "operations" de type NSArray (le tableau d'opérations liées à  ce mois).

    Sachant que si ta clé représente effectivement un mois, plutôt que d'utiliser une NSString tu ferais mieux au passage soit d'utiliser un objet NSDate, soit d'utiliser 2 propriétés "int mois" et "int annee", ce qui pourrait ensuite te permettre de manipuler, filtrer, trier ces objets selon ces propriétées, sachant qu'il n'est pas dur re reconstruire le nom du mois à  partir de ces 2 propriétés pour l'affichage.

    Tu auras ainsi un NSArray d'objet Mois, chaque objet Mois ayant un nom et une liste ordonnée d'opérations.



    2) Tu peux aussi, si tu comptes bien plus souvent avoir besoin d'accès random à  tes données (récupérer les opérations d'un mois quelconque quel qu'il soit), garder ta structure en NSDictionary où à  chaque clé est associée un NSArray d'opérations. Et quand tu as besoin d'afficher les clés de manières triées, tu récupères [tt]allKeys[/tt] du dictionnary, tu tries le tableau ainsi obtenu (par date croissante) et tu t'en sers.ainsi. Encore faut-il que le tri alphabétique ou par date croissante te corresponde.



    3) Dernière solution tu gardes à  la fois le NSDictionnary pour les accès random d'un côté, et le NSArray de tes mois de l'autre côté pour l'accès séquentiel dans l'ordre déterminé. Après tout, vu qu'en Cocoa on a le Reference Counting avec les retain/release, les objets NSString ne seront pas dupliqués dans le NSArray et en tant que clés du NSDictionary (donc ça ne prendra pas le double de mémoire), ça sera les mêmes instances de NSString dans les 2 endroits, donc c'est pas trop gênant. Faut juste s'assurer de maintenir la cohérence à  caude de cette redondance.





    Moi je resterai quand même à  te conseiller de créer un objet "Mois" avec propriétés "mois", "annee" et "operations", et stocker ça dans un NSArray si tu n'as pas d'accès random de tes valeurs et ne fais que des parcours séquentiels
  • C'est vrai t'as raison ! En faite, j'ai l'impression que je me suis carrément trompé de façon de penser ^^ oups ! Ce serait peux être plus judicieux de créer un tableau de dictionnaire plutôt... :/ ! Je vais approfondir ça, je reviens vers vous si j'ai une solution ou ... pas ^^! En tout cas, merci de m'avoir aidé image/wink.png' class='bbc_emoticon' alt=';)' />
  • 'AliGator' a écrit:


    Moi je resterai quand même à  te conseiller de créer un objet "Mois" avec propriétés "mois", "annee" et "operations", et stocker ça dans un NSArray si tu n'as pas d'accès random de tes valeurs et ne fais que des parcours séquentiels




    T'as raison c'est vrai.. Je vais approfondir merci pour ton aide !
Connectez-vous ou Inscrivez-vous pour répondre.