On dirait que vous pouvez utiliser NSSet comme la clé de NSDictionary:
NSMutableDictionary * dict = [NSMutableDictionary dictionary];
NSSet * set;
set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
[dict setObject:@"1" forKey:set];
set = [NSSet setWithObjects:@"b", @"c", @"d", @"e", nil];
[dict setObject:@"2" forKey:set];
id key;
NSEnumerator * enumerator = [dict keyEnumerator];
while ((key = [enumerator nextObject]))
NSLog(@"%@ : %@", key, [dict objectForKey:key]);
set = [NSSet setWithObjects:@"c", @"b", @"e", @"d", nil];
NSString * value = [dict objectForKey:set];
NSLog(@"set: %@ : key: %@", set, value);
Sorties:
2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2
Une autre façon est d'utiliser NSMutableDictionary
qui détient plusieurs de NSSet
des articles et des prix comme une clé, cependant, il est noté que cela ne fonctionnera pas si le prix n'est pas unique.
Vous vérifiez manuellement si l'ensemble est dans le dictionnaire en itérant sur les éléments et pour chaque ensemble en utilisant isEqualToSet:
- à moins que n'importe qui peut trouver une meilleure façon.
Si si elle ne vous pouvez l'insérer est de retourner le prix (clé) avec un prix, les parties principales:
@interface ShoppingList : NSObject
{
NSMutableDictionary * shoppingList;
}
- (void)setList:(NSSet*)aList
forPrice:(double)aPrice
{
[shoppingList setObject:aList forKey:[NSNumber numberWithDouble:aPrice]];
}
- (double)priceForList:(NSSet*)aList
{
id key;
NSEnumerator * enumerator = [shoppingList keyEnumerator];
while ((key = [enumerator nextObject]))
{
NSSet * list = [shoppingList objectForKey:key];
if ([aList isEqualToSet:list])
{
return [(NSNumber*)key doubleValue];
}
}
return 0.0;
}
{
ShoppingList * shoppingList = [[ShoppingList alloc] init];
NSSet * list;
double price = 0.0;
list =
[NSSet setWithObjects:@"apple",@"green_apple",@"pineapple",nil];
[shoppingList setList:list forPrice:9.99];
list =
[NSSet setWithObjects:@"grapes",@"banana",@"strawberries",@"apple",nil];
[shoppingList setList:list forPrice:15.99];
list =
[NSSet setWithObjects:@"orange",@"grapes",@"green_apple",nil];
[shoppingList setList:list forPrice:7.50];
// searching for this
list =
[NSSet setWithObjects:@"grapes",@"banana",@"strawberries",@"apple",nil];
price = [shoppingList priceForList:list];
if (price != 0.0)
{
NSLog(@"price: %.2f, for pricelist: %@", price, list);
}
else
{
NSLog(@"shopping list not found: %@", list);
[shoppingList setList:list forPrice:15.99];
}
}
Mais que faire si le prix n'était pas unique? – erotsppa
Puis stocker les objets dans NSMutableSets, et au lieu d'ajouter un nouvel ensemble avec le même prix vérifier pour voir si un ensemble existe déjà avec ce prix, et ajouter des objets dans ce cas. –
Tout ce que je peux penser au cas où le prix n'est pas unique est de créer un enregistrement, soit une classe personnalisée ou NSDictionary de NSSet, la liste des éléments, et le prix, et pour la clé que vous utiliseriez quelque chose comme id unique (int). – stefanB