2009-08-19 66 views
1

在我当前的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"; 
    } 
    ); 
} 

回答

1
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"]]; 
    } 
} 
+0

我一直认为钥匙查点员是浪费。它通常意味着 - 遍历关键字,然后将每个值作为“搜索”操作。 – 2009-08-19 18:01:13

+0

感谢您的帮助。我发现一个小的错别字:objectWithKey应该是objectForKey。 另外,数组在哪里添加到newDict? 谢谢! – Jonah 2009-08-19 18:11:09

+0

下面是我最终做的工作: NSString * name = [entry objectForKey:@“Name”]; [newList addObject:[NSDictionary dictionaryWithObject:name forKey:@“Name”]]; NSString * afirstLetterString = [name substringToIndex:1]; [newDict setObject:newList forKey:afirstLetterString]; – Jonah 2009-08-19 18:47:43

2

核心基础有很大的作用,CFDictionaryApplyFunction(我希望他们移植的功能NSDictionary太)。但是,NSDictionaryCFDictionary是“免费桥梁”,这意味着您可以免费投射它们。

因此,解决方案是创建一个应用函数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以考虑您自己的数据结构,但这基本上是实现它的方式。

+0

数组在哪里? – 2009-08-19 17:59:35

+0

@Nikolai:我说我假设只有一个对象,并且它可能会改变以支持其他数据结构以及.. 此外,在您的答案中,您忘了将该数组稍后添加到“newDict”中... – 2009-08-19 18:03:34