【问题标题】:Creating NSDictionary with keys that have multiple values使用具有多个值的键创建 NSDictionary
【发布时间】: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 我相信你误解了我的问题

标签: objective-c ios nsmutablearray nsdictionary


【解决方案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命名变量。
    • 对不起,我真的没想到 stackoverflow 编码约定,所以我从来没有寻找它们... :-(
    • @ChristianStieber -- 它们是标准的 C 约定,被 C 程序员使用(显然在微软除外)。
    • @ChristianStieber:看看 Apple 的示例代码。 Objective-C 代码遵循一个非常简单的约定,变量和方法名在lowerCamelCase 中,类在UpperCamelCase 中。该规则有一些例外,但大多数情况都是如此。使用UpperCamelCase 变量名很难区分接收者是类还是实例。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2018-10-25
    相关资源
    最近更新 更多