Je veux dire: L'ordre des clés et des valeurs dans un NSDictionary est-il toujours le même que la façon dont ils ont été spécifiés lors de l'initialisation du NSDictionary? Ou devrais-je mieux maintenir un NSArray séparé si j'ai vraiment besoin de connaître l'ordre des clés?Les clés et les valeurs d'un NSDictionary sont-elles classées?
Répondre
Non, ils ne sont pas commandés. Tant que vous n'ajoutez ou ne supprimez aucun élément du dictionnaire, ils restent dans le même ordre, mais dès que vous ajoutez ou supprimez un élément, la nouvelle commande sera complètement différente.
Si vous avez besoin des clés/valeurs à commander, utilisez un NSArray (ou une autre structure de données ordonnée) à la place.
Les clés ne sont jamais garanties d'être dans le même ordre lors de l'accès à un NSDictionary. Si les clés peuvent être comparées (je suppose que vous pouvez leur donner votre question), alors vous pouvez toujours les trier si vous avez besoin d'y accéder dans l'ordre.
Vous devrez le faire en lisant les clés dans un tableau en premier et en triant le tableau bien sûr.
NSDictionary, selon Apple's reference, est fondamentalement une enveloppe autour d'une table de hachage. Donc non, ils ne sont pas garantis d'être dans un ordre particulier.
Comment accèdent-ils à cette table de hachage? Je n'ai jamais vu une table de plaine, mais j'aimerais savoir à quoi cela ressemble. Est-ce une grande différence d'utiliser deux NSArray synchrone en interne? –
Demandez-vous à quoi ressemble une table de hachage en tant que structure de données? Wiki a une très bonne explication: http: //en.wikipedia.org/wiki/Hash_table Si vous voulez savoir comment Apple les implémente et y accède spécifiquement, je crains que les seules choses disponibles pour nous soient les fichiers d'en-tête;) –
alors quand j'aurai raison, une table de hachage est presque tout fonction de hachage qui calcule l'index de tableau correct pour une clé de chaîne donnée + la taille du tableau. Cela semble difficile à mettre en œuvre, mais bon pour la performance. Si c'est vrai, peu importe le nombre d'éléments ajoutés à un dictionnaire. –
Les clés NSDictionary & ne sont pas commandées. Vos options:
- Maintenir un tableau séparé des clés dans l'ordre que vous désirez
- écrire ou trouver une classe existante qui est un wrapper pour ce qui précède
- écrire ou trouver une sous-classe existante de NSDictionary qui ajoute API pour la commande
Matt Gallagher a écrit un billet de blog intitulé “OrderedDictionary: Subclassing a Cocoa class cluster” couvrant exactement ce problème, avec un exemple de code.
En fait, vous ne pouvez même pas compter sur l'ordre étant le même lors de l'exécution du programme dans deux appareils différents, même si c'est exactement le même programme et la même version exacte du système d'exploitation. Par exemple, si vous exécutez le programme sur un iPad Air, l'ordre des éléments dans NSDictionary peut être différent que lorsque vous exécutez le même programme sur un iPad Retina, même si la version iOS est exactement la même.
En bref, l'ordre des éléments dans NSDictionary ne doit jamais être invoqué. Vous devez toujours supposer qu'ils peuvent être dans n'importe quel ordre non spécifié, ce qui peut être différent sur différents appareils.
@ kraag22: Nulle part dans la documentation 'NSDictionary' ne fait de promesses ou de garanties sur l'ordre - il dit simplement qu'il fournit une" interface programmatique aux objets qui gèrent des associations immuables de clés et de valeurs ". Les docs pour les messages '-allKeys' et' -allValues' signalent que l'ordre retourné par ces méthodes n'est pas défini, bien que ce ne soit probablement pas une mauvaise idée de rendre cela plus explicite pour d'autres façons d'énumérer les éléments du dictionnaire. –