82 votes

NSDictionary avec les clés commandées

Je suis curieux de savoir si c'est une situation que tous les autres gens ont trouvé eux-mêmes. J'ai un NSDictionary (stockées dans un fichier plist) que je suis fondamentalement d'utiliser comme un tableau associatif (les chaînes de caractères comme des clés et des valeurs). Je veux utiliser le tableau de clés dans le cadre de mon application, mais je voudrais qu'ils soient dans un ordre spécifique (pas vraiment un, afin que je puisse écrire un algorithme pour trier dans). Je pourrais toujours stocker un tableau séparé des clés, mais qui semble sorte de kludgey parce que je voudrais toujours avoir à mettre à jour les clés du dictionnaire ainsi que les valeurs de la matrice, et assurez-vous qu'ils correspondent toujours. Actuellement je viens de l'utiliser [mondictionnaire allKeys], mais évidemment, cela renvoie dans l'arbitraire, non-garantie de l'ordre. Est-il une structure de données en Objective-C que je suis absent? Quelqu'un aurait-il des suggestions sur la façon la plus élégante de faire cela?

70voto

Jon Shea Points 1039

Matt Gallagher vient d'écrire un article sur le blog intitulé "OrderedDictionary: sous-classer un cluster de classes Cocoa" couvrant exactement ce problème, avec un exemple de code.

23voto

Abizern Points 52378

La solution d'avoir un NSMutableArray associé de clés n'est pas si mal. Cela évite de sous-classer NSDictionary, et si vous êtes prudent avec l'écriture d'accesseurs, il ne devrait pas être trop difficile de rester synchronisé.

20voto

Quinn Taylor Points 29688

Je suis en retard pour le jeu avec une réponse réelle, mais vous pourriez être intéressé à étudier CHOrderedDictionary. C'est une sous-classe de NSMutableDictionary qui encapsule une autre structure pour le maintien de la touche de commande. (Cela fait partie de CHDataStructures.- cadre.) Je trouve que c'est plus pratique que la gestion d'un dictionnaire et un tableau séparément.

Divulgation: Il est open-source code que j'ai écrit. En espérant juste qu'il peut être utile à d'autres personnes confrontées à ce problème.

14voto

Black Tiger Points 157

Il n’existe aucune méthode intégrée de ce type à partir de laquelle vous pouvez acquérir ceci. Mais une logique simple fonctionne pour vous. Vous pouvez simplement ajouter quelques textes numériques devant chaque touche pendant que vous préparez le dictionnaire. Comme

 NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
                       @"01.Created",@"cre",
                       @"02.Being Assigned",@"bea",
                       @"03.Rejected",@"rej",
                       @"04.Assigned",@"ass",
                       @"05.Scheduled",@"sch",
                       @"06.En Route",@"inr",
                       @"07.On Job Site",@"ojs",
                       @"08.In Progress",@"inp",
                       @"09.On Hold",@"onh",
                       @"10.Completed",@"com",
                       @"11.Closed",@"clo",
                       @"12.Cancelled", @"can",
                       nil]; 
 

Maintenant, si vous pouvez utiliser sortingArrayUsingSelector tout en obtenant toutes les clés dans le même ordre que vous placez.

 NSArray *arr =  [[dict allKeys] sortedArrayUsingSelector:@selector(localizedStandardCompare:)];
 

À l’endroit où vous voulez afficher les clés dans UIView, coupez simplement le caractère 3 avant.

7voto

Ashley Clark Points 6806

Si vous allez à la sous-classe NSDictionary vous avez besoin pour mettre en œuvre ces méthodes au minimum:

  • NSDictionary
    • -count
    • -objectForKey:
    • -keyEnumerator
  • NSMutableDictionary
    • -removeObjectForKey:
    • -setObject:forKey:
  • NSCopying/NSMutableCopying
    • -copyWithZone:
    • -mutableCopyWithZone:
  • NSCoding
    • -encodeWithCoder:
    • -initWithCoder:
  • NSFastEnumeration (Leopard)
    • -countByEnumeratingWithState:objects:count:

La façon la plus simple de faire ce que vous voulez, c'est de faire une sous-classe de NSMutableDictionary qui contient sa propre NSMutableDictionary qu'il manipule et un NSMutableArray pour stocker un ensemble ordonné de touches.

Si vous n'êtes jamais aller à l'encodage de vos objets vous pourriez concevable ignorer la mise en œuvre de -encodeWithCoder: et -initWithCoder:

Tous de votre méthode mises en œuvre dans les 10 méthodes ci-dessus puis aller directement à travers votre hébergé dictionnaire ou commandés tableau de clés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X