使用具有多个值的键创建 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的主要内容,如果未能解决你的问题,请参考以下文章

Python:从字典中获取具有最小值但有多个最小值的键

MongoDB查询以获取与具有多个值的键匹配的所有文档[重复]

返回具有给定短语(数组)值的键

如何解析具有多个值的 json?

具有单个键的多个值的STL集合

使用 keyof 提取仅具有特定类型值的键的字符串文字联合