Cacao: Cualquier desventaja de usar NSSet como clave en NSMutableDictionary?
-
16-09-2019 - |
Pregunta
¿Hay alguna desventaja de usar NSSet
como clave en NSMutableDictionary
, los aspectos críticos a tener en cuenta, cualquier grandes éxitos de rendimiento?
Creo que las claves se copian en contenedores de cacao, significa NSSet se copia al diccionario? ¿O hay alguna optimización que conserva la NSSet en este caso?
Puede un NSDictionary tomar en NSSet como clave?
código de ejemplo:
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);
Salidas:
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
Solución
Creo que las claves se copian en contenedores de cacao, significa NSSet se copia al diccionario? ¿O hay alguna optimización que conserva la NSSet en este caso?
NSDictionaries hacen copiar sus claves.
Un conjunto inmutable probablemente responder a copy
volviendo en sí retenido, por lo que la “copia” prácticamente libre.
Un conjunto mutable responderá a copy
devolviendo una copia de sí mismo, por lo que el uso de objetos mutables como claves es generalmente una mala idea (que no será capaz de encontrar el original después mutando porque ya no compara la igualdad a la tecla en el diccionario).
Otros consejos
Ooh. Si. Hay una gran desventaja rendimiento. Sucede que -[NSSet hash]
se implementa como [set count]
. Eso significa que si todos los conjuntos tienen 2 objetos, por ejemplo, a continuación, todos ellos tienen el mismo hash, y la colección llevará a cabo muy mal.