2010-08-09 1 views
8

Пожалуйста, сообщите мне, как иметь много значений для одного и того же ключа в NSMutableDictionary? , потому что, когда я использую ниже подход, значения являются заменяю с недавним однойNSMutableDictionary с одним ключом, содержащим множество значений в программировании Objective-C

В моем случае:

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

, когда я просматривать содержимое словаря, я получаю только reminderDate для ключевого кода. здесь код одинаковый для всех значений. помогите мне, как избежать имени и фамилии, заменяемой плановымРемондом.

Спасибо

ответ

15

Похоже, вы используете code в качестве ключа, и вы хотите, чтобы представлять несколько значений, основанных на code. В этом случае, вы должны либо:

  1. Аннотация все данные, связанные с code в отдельный класс (возможно, под названием Person) и использовать экземпляры этого класса в качестве значений в словаре.

  2. Использование более чем один слой словарей:

    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

Не просто вниз, дайте мне знать, что случилось, чтобы я мог исправить это! – dreamlax

1

Я не думаю, что вы понимаете, как работают словари. У каждого ключа может быть только одно значение. Вам понадобится словарь словарей или словарь массивов.

Здесь вы создаете словарь для каждого человека, а затем храните его в своем основном словаре.

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

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

Если вы действительно непреклонны хранения объектов в словаре, и если вы имеете дело со строками, вы всегда можете добавить все ваши строки вместе, разделенных запятыми, а затем при извлечении объекта из ключа , у вас будут все ваши объекты в формате квази-csv! Затем вы можете легко разобрать эту строку в массив объектов.

Вот некоторые примеры кода можно запустить:

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]; 

А затем извлечь и разобрать объект в словаре:

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

Это не может быть столь же чистым, как имеющие слои словарей например, dreamlax, но если вы имеете дело со словарем, в котором вы хотите сохранить массив для ключа, а объекты в этом массиве не имеют конкретных ключей, это решение!

+0

Почему бы просто не использовать 'NSString * dummy = stringWithFormat: @"% @,% @,% @ ", forename, surname, reminderDate];'. По крайней мере, вы должны использовать 'NSMutableString', если вы конкатенируете таким образом. – dreamlax

1

Современный синтаксис намного чище.

A. Если вы создаете статическую структуру во время загрузки:

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

B. Если при добавлении элементов в режиме реального времени (возможно):

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

Тогда вы получаете доступ как 2D словарь ...

mDic[code][@"forename"]; 

 Смежные вопросы

  • Нет связанных вопросов^_^