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?
Réponses
Trop de publicités?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.
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.
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.
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.