2009-06-19 6 views
6

NSDictionary est bon pour les paires clé-valeur, par quelle structure de données est la meilleure lorsque vous avez trois valeurs? Est-il préférable de créer une classe pour ces 3 valeurs, puis de laisser chaque objet dans un tableau contenir des instances de cette classe?Si NSDictionary est bon pour les valeurs appariées, qu'est-ce qui est bon pour les valeurs triples?

Pour être plus précis: La structure de données, nous allons l'appeler personne, j'envisage trois valeurs: (NSString) nom, (int) ans, (BOOL) isAlive

Ceux-ci seraient tenues dans le tableau (?). Il est important de pouvoir utiliser le nom en tant que clé, et aussi se référer à l'ensemble du bloc avec un nombre, en commençant à zéro.

+1

Cette nouvelle structure aurait-elle 2 clés et 1 valeur ou 1 clé et 2 valeurs? Ou interchangeable? – samoz

+0

Je pense que vous devez expliquer la question de manière plus approfondie. – U62

+1

Oui, NSDictionary stocke les paires clé-valeur, mais ce n'est pas vraiment le point. Les paires ne sont pas symétriques, vous ne pouvez pas généraliser à des "triples" sans considérer que tout le * point * de NSDictionary est que les clés sont uniques alors que les valeurs n'ont pas besoin d'être. Donc, dans vos «triplés», lesquels des trois éléments sont semblables à des valeurs et lesquels sont semblables à des clés? – bendin

Répondre

9

Si vous avez une clé et deux valeurs, vous créez probablement une classe pour les deux valeurs et utilisez toujours un dictionnaire.

Si vous avez deux clés et une valeur, vous utiliserez probablement un dictionnaire imbriqué, c'est-à-dire un dictionnaire où la clé est la première clé et la valeur est un autre dictionnaire. La clé pour le dictionnaire imbriqué serait la deuxième clé, et la valeur serait votre valeur réelle.

ETA:

Maintenant que vous avez éclairci votre question - si vous avez besoin d'accéder à votre collection à la fois par clé ou par index entier, vous pouvez toujours utiliser un dictionnaire.

Pour obtenir un élément par clé, vous feriez ceci:

[myDict objectForKey:@"joe"]; 

Pour obtenir un élément par index, vous pouvez utiliser le tableau AllKeys:

[myDict objectForKey:[[myDict allKeys] objectAtIndex:1]]; 

Si le seul but d'obtenir les personnes par index sont en boucle sur l'ensemble de la collection, vous feriez mieux d'utiliser la méthode keyEnumerator pour énumérer les clés dans une boucle et utiliser ces clés pour rechercher les valeurs.

-1

N'est-ce pas la description d'un tableau two dimensional?

+0

Vous pensez à un tableau dans lequel chaque élément est lié à un tableau contenant 3 éléments. Cependant, un tableau à deux dimensions n'a rien à voir avec le stockage des paires clé-valeur - cela nécessite un dictionnaire, quelque chose que vous pouvez aussi voir comme "carte", "tableau associatif", "hachage", etc. prend en charge des paires de 1 valeur de clé à 1 - il cherche 1 clé à 3 valeurs. –

0

Cela dépend si vous essayez de créer une sorte de structure de données généralisée ou non. Si les «trois» choses sont des concepts particuliers au sein de votre application, alors vous vous dirigez peut-être vers un domain model - auquel cas vous pourriez être sage d'encapsuler ces valeurs dans une classe.

Si vous avez besoin d'une fonctionnalité semblable à un dictionnaire - [NSDictionary objectForKey:] etc. - vous pouvez toujours utiliser un ou plusieurs dictionnaires comme index qui mappent des valeurs de clé à vos instances de classe.

1

Vous pouvez utiliser des données de base pour représenter des relations de données plus complexes, à l'aide d'un modèle de base de données relationnelle.

Consultez le site du développeur Apple pour obtenir des exemples et de la documentation.

0

Vous devez examiner CoreData (si vous le stockez) et définir une classe pour votre objet. Les objets génériques natifs tels que NSDictionary ne sont pas conçus pour stocker des valeurs complexes qui constituent des objets complexes comme une personne.

Person *person = [[Person alloc] init]; 
person.firstName = @"blah"; 
person.age = 24; 
person.isAlive = YES; 
1

Il peut sembler sans rapport au début, mais il faut vérifier la structure orientée dictionnaire dans ce Introduction to Cocoa Bindings. (CocoaDevCentral et Scott Stevenson sont d'excellentes ressources pour les nouveaux développeurs Cocoa.) L'approche qu'il utilise est extrêmement flexible et facile à changer sur la route.L'utilisation d'un dictionnaire à la place d'ivars n'est pas toujours la meilleure solution, mais elle pourrait bien convenir à vos besoins.

Note: Comme les données de base, les liaisons de cacao est également un sujet très complexe. Je suggère d'utiliser seulement l'aspect organisationnel du tutoriel, ne pas aller tout à fait avec des liaisons. :-)