使用具有多个值的键创建NSDictionary

时间:2012-07-04 09:02:36

标签: objective-c ios nsmutablearray nsdictionary

我有一个包含NSDictionary dic1对象的可变数组

每个字典都有一个名为contactId的密钥,多个字典可以具有相同的contactId值。

我想要做的是创建一个NSDictionary,其唯一contactIds作为键,数组值包含所有NSDictionary dic1对象的列表,其值为{{ 1}}等于键。

我该怎么做?

我的数据如下:

contactId

我希望它变成这样:

**myArray**:[  **dic1** {contactId = x1 , name = name1 }, **dic2**{contactId = x2, name = 
name2 }, **dic3**{contactId = x1, name = name3} ]

2 个答案:

答案 0 :(得分:3)

使用快速枚举:

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

答案 1 :(得分:0)

经典方式怎么样?

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字典。不过,我还没有测试过(甚至编译过)。