2010-08-09 19 views
8

¿Me puede indicar cómo tener muchos valores para la misma clave en NSMutableDictionary? porque cuando se utiliza el enfoque de abajo, los valores están siendo reemplaza con la recienteNSMutableDictionary con una sola tecla que contiene muchos valores en la programación de Objective-C

En mi caso:

[dictionary setObject:forename forKey:[NSNumber numberWithint:code]]; 
[dictionary setObject:surname forKey:[NSNumber numberWithint:code]]; 
[dictionary setObject:reminderDate forKey:[NSNumber numberWithint:code]]; 

cuando veo el contenido del diccionario, me sale sólo el reminderDate de código de la llave. aquí el código es el mismo para todos los valores. ayúdame a evitar que el nombre y apellido sean reemplazados por plannedReminder.

Usted

Respuesta

15

Gracias Parece que está utilizando code como la clave y desea representar valores múltiples basados ​​en code. En ese caso, deberán:

  1. Resumen todos los datos asociados con code en una clase separada (tal vez llamado Person) y utilizar instancias de esta clase como valores en el diccionario.

  2. Usar más de una capa de diccionarios:

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    
    NSMutableDictionary *firstOne = [NSMutableDictionary dictionary]; 
    [firstOne setObject:forename forKey:@"forename"]; 
    [firstOne setObject:surname forKey:@"surname"]; 
    [firstOne setObject:reminderDate forKey:@"reminderDate"]; 
    
    [dictionary setObject:firstOne forKey:[NSNumber numberWithInt:code]]; 
    
    // repeat for each entry. 
    
+9

No me lo pierdas, avísame qué pasa para poder solucionarlo. – dreamlax

1

no creo que entienda cómo funcionan los diccionarios. Cada clave solo puede tener un valor. Querrá tener un diccionario de diccionarios o un diccionario de matrices.

Aquí puede crear un diccionario para cada persona y luego almacenarlo en su diccionario maestro.

NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys: 
forename, @"forename", surname, @"surname", @reminderDate, "@reminderDate", nil]; 

[dictionary setObject:d forKey:[NSNumber numberWithint:code]]; 
5

Si está realmente inflexible sobre el almacenamiento de objetos en un diccionario, y si se trata de cadenas, siempre se puede añadir todas sus cadenas juntas separadas por comas, y luego al recuperar el objeto de la clave , ¡tendrás todos tus objetos en un formato cuasi-csv! A continuación, puede analizar fácilmente esa cadena en una matriz de objetos.

Aquí hay un código de ejemplo que podría funcionar:

NSString *forename = @"forename"; 
NSString *surname = @"surname"; 
NSString *reminderDate = @"10/11/2012"; 
NSString *code = @"code"; 

NSString *dummy = [[NSString alloc] init]; 
dummy = [dummy stringByAppendingString:forename]; 
dummy = [dummy stringByAppendingString:@","]; 
dummy = [dummy stringByAppendingString:surname]; 
dummy = [dummy stringByAppendingString:@","]; 
dummy = [dummy stringByAppendingString:reminderDate]; 
dummy = [dummy stringByAppendingString:@","]; 
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; 
[dictionary setObject:dummy forKey:code]; 

Y entonces para recuperar y analizar el objeto en el diccionario:

NSString *fromDictionary = [dictionary objectForKey:code]; 
NSArray *objectArray = [fromDictionary componentsSeparatedByString:@","]; 
NSLog(@"object array: %@",objectArray); 

Puede que no sea lo más limpio que tiene capas de diccionarios como sugiere Dreamlax, pero si se trata de un diccionario en el que se quiere almacenar una matriz para una clave y los objetos en esa matriz no tienen claves específicas, ¡esta es una solución!

+0

¿Por qué no simplemente usar 'NSString * dummy = stringWithFormat: @"% @,% @,% @ ", nombre de pila, apellido, fecha de recuerdo];'. Por lo menos, debe usar un 'NSMutableString' si está concatenándose de esa manera. – dreamlax

1

La sintaxis moderna es mucho más limpia.

A. Si usted está construyendo una estructura estática en tiempo de carga:

NSDictionary* dic = @{code : @{@"forename" : forename, @"surname" : surnamem, @"reminderDate" : reminderDate}/*, ..more items..*/}; 

B. Si sus artículos adición en tiempo real (probablemente):

NSMutableDictionary* mDic = [[NSMutableDictionary alloc] init]; 
[mDic setObject:@{@"forename" : forename, @"surname" : surnamem, @"reminderDate" : reminderDate} forKey:code]; 
//..repeat 

Entonces acceso como Diccionario 2D ...

mDic[code][@"forename"]; 
Cuestiones relacionadas