Копирование словаря с несколькими под-словарями и возврат только определенных ключей из под-словарей - PullRequest
1 голос
/ 19 августа 2009

В моем текущем проекте iPhone я создал словарь, который группирует под словари по первой букве клавиши «Имя». NSLog возвращает следующее. Я хотел бы создать идентичный словарь, который показывает только ключ «Имя» под каждым начальным буквенным ключом. Как лучше всего сделать копию некоторых предметов в словарях? Методы ObjectForKey будут выбирать только элементы для начальной буквы (например, «B» или «C»). Пожалуйста, дайте мне знать, если я не объяснил это достаточно ясно. Спасибо!

sectionedDictionaryByFirstLetter:{
B =     (
            {
        Name = "B...A Name Starting with B";
        Image = "ImageName1.png";
        Text = "Some Text";
     }
 );
C =     (
            {
        Name = "C...A Name Starting with C";
        Image = "ImageName2.png";
        Text = "Some Text";
     }
 );
N =     (
            {
        Name = "N...A Name Starting with N";
        Image = "ImageName3.png";
        Text = "Some Text";

     },
            {
        Name = "N...A Name Starting with N";
        Image = "ImageName4.png";
        Text = "Some Text";

     },
            {
        Name = "N...A Name Starting with N";
        Image = "ImageName5.png";
        Text = "Some Text";

     }
   );
}

Окончательный результат, который я ищу:

sectionedDictionaryByFirstLetter:{
B =     (
            {
        Name = "B...A Name Starting with B";
     }
 );
C =     (
            {
        Name = "C...A Name Starting with C";
     }
 );
N =     (
            {
        Name = "N...A Name Starting with N";
     },
            {
        Name = "N...A Name Starting with N";
     },
            {
        Name = "N...A Name Starting with N";
     }
   );
}

Ответы [ 2 ]

2 голосов
/ 19 августа 2009

Core Foundation имеет отличную функцию, CFDictionaryApplyFunction (хотелось бы, чтобы они также перенесли его функциональность на NSDictionary). Однако NSDictionary и CFDictionary являются «бесплатными мостами», что означает, что вы можете разыгрывать между ними бесплатно.

Итак, решением было бы создать функцию applier, SaveName, которая будет использоваться в CFDictionaryApplyFunction выше. Пример:

void SaveName(const void* key, const void* value, void* context) {
  NSMutableDictionary* result = (NSMutableDictionary*) context;
  NSDictionary* dataDict = (NSDictionary*) value;
  NSString* letterKey = (NSString*) key;
  [result setObject:[dataDict valueForKey:@"Name"] forKey:@letterKey];
}

void main() {

   NSDictionary* exampleDict = .. ;
   NSMutableDictionary* resultDict = [NSMutableDictionary dictionary];
   CFDictionaryApplyFunction((CFDictionaryRef)exampleDict, SaveName, (void*)resultDict);
   // now, the resultDict contains key-value pairs of letter-name!
}

В моем коде предполагается, что в словаре «значение» есть только один объект. Вы можете изменить SaveName, чтобы учесть свою собственную структуру данных, но это в основном способ сделать это.

1 голос
/ 19 августа 2009
NSMutableDictionary* newDict = [NSMutableDictionary dictionary];
for (NSString* key in sectionedDictionaryByFirstLetter) {
    NSMutableArray* newList = [NSMutableArray array];
    [newDict setObject:newList forKey:key];
    for (NSDictionary* entry in [sectionedDictionaryByFirstLetter objectForKey:key]) {
        NSString* name = [entry objectForKey:@"Name"];
        [newList addObject:[NSDictionray dictionaryWithObject:name forKey:@"Name"]];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...