使用具有多个值的键创建 NSDictionary
Posted
技术标签:
【中文标题】使用具有多个值的键创建 NSDictionary【英文标题】:Creating NSDictionary with keys that have multiple values 【发布时间】:2012-07-04 09:02:35 【问题描述】:我有一个包含NSDictionary
dic1 对象的可变数组,
每个字典都有一个名为contactId
的键,contactId
可以有多个字典具有相同的值。
我想做的是创建一个NSDictionary
,其中唯一的contactIds
作为键和一个数组值,其中包含所有NSDictionary
dic1 对象的列表,其中contactId
的值等于键。
我该怎么做?
我的数据如下所示:
**myArray**:[ **dic1** contactId = x1 , name = name1 , **dic2**contactId = x2, name =
name2 , **dic3**contactId = x1, name = name3 ]
我希望它变成这样:
**NSDictionary**: **x1**:[dic1, dic3], **x2**:[dic2]
【问题讨论】:
你不能拥有只有值的字典。它需要两者兼备,它是一种数据结构,旨在看起来像这样并相应地表现。 @ant 我相信你误解了我的问题 【参考方案1】:使用快速枚举:
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (id obj in myArray)
NSString *contactId = [obj objectForKey:@"contactId"];
NSMutableSet *contacts = [result objectForKey:contactId];
if (!contacts)
contacts = [NSMutableSet set]
[result setObject:contacts forKey:contactId];
[contacts addObject:obj];
你可以使用积木并没有真正的额外好处:
__block NSMutableDictionary *result = [NSMutableDictionary dictionary];
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
NSString *contactId = [obj objectForKey:@"contactId"];
NSMutableSet *contacts = [result objectForKey:contactId];
if (!contacts)
contacts = [NSMutableSet set]
[result setObject:contacts forKey:contactId];
[contacts addObject:obj];
];
【讨论】:
【参考方案2】:经典的方式怎么样?
NSMutableDictionary* Result;
NSEnumerator* Enumerator;
NSDictionary* Dict;
Result=[[NSMutableDictionary alloc] init];
Enumerator=[YourArray objectEnumerator];
while ((Dict=[Enumerator nextObject])!=nil)
NSString* ContactID;
NSMutableSet* Contacts;
ContactID=[Dict objectForKey:@"contactID"];
Contacts=[Result objectForKey:ContactID];
if (Contacts==nil)
Contacts=[[NSMutableSet alloc] init];
[Result setObject:Contacts forKey:ContactID];
[Contacts release];
[Contacts addObject:Dict];
这应该创建一个 Result 字典。不过,我还没有测试(甚至编译)这个。
【讨论】:
请遵循编码约定,并使用lowerCamelCase
命名变量。
对不起,我真的没想到 *** 编码约定,所以我从来没有寻找它们... :-(
@ChristianStieber -- 它们是标准的 C 约定,被 C 程序员使用(显然在微软除外)。
@ChristianStieber:看看 Apple 的示例代码。 Objective-C 代码遵循一个非常简单的约定,变量和方法名在lowerCamelCase
中,类在UpperCamelCase
中。该规则有一些例外,但大多数情况都是如此。使用UpperCamelCase
变量名很难区分接收者是类还是实例。以上是关于使用具有多个值的键创建 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章