Ios NSDictionary数组 - 分组值和键

时间:2013-09-14 06:46:13

标签: iphone ios objective-c arrays nsdictionary

我有NSDictionary数组

的以下结果
Bath =     {
    Keynsham =         (
        "nsham companies"
    );
};


Bath =     {
    "Midsomer Norton" =         (
        "Keynsham companies"
    );
};


Bath =     {
    "Norton Radstock" =         (
        "Keynsham taxi companies"
    );
};


Birmingham =     {
    "Acock's Green" =         (
        "Acock's Green taxi companies"
    );
};


Birmingham =     {
    "Alcester Lane's End" =         (
        "Alcester Lane's End taxi companies"
    );
};

如何组合值和键,以便我最终只得到一个类别,如下所示;

Bath =     {
    "Norton Radstock" =         (
        "Keynsham taxi companies"
    );
 "Midsomer Norton" =         (
        "Keynsham companies"
    );

   Keynsham =         (
        "nsham companies"
    );

};

我不确定这是否是解释它的最佳方式  代码如下

//所有Nssarrays分配/初始化

  NSURL *url=[NSURL URLWithString:@"http://y.php"];
        NSData *data= [NSData dataWithContentsOfURL:url];

        NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:Nil];
        //instantiate arrays to hold data

        NSMutableDictionary *dictArray=[[NSMutableDictionary alloc]init];
        NSArray *cityName=[[NSArray alloc]init];
        NSArray *townName=[[NSArray alloc]init];
        NSArray *taxis=[[NSArray alloc]init];  

        NSArray *ids=[[NSArray alloc]init];

        for (int i=0; i<json.count; i++)
        {

            //cityName=[[NSMutableArray alloc] initWithCapacity:json.count];

           ids = [[json objectAtIndex:i] objectForKey:@"id"];
           cityName = [[json objectAtIndex:i] objectForKey:@"cityName"];
           townName=[[json objectAtIndex:i] objectForKey:@"townName"];

           taxis=[[json objectAtIndex:i] objectForKey:@"taxis"];



        NSMutableArray  *taxisArray=[[NSMutableArray  alloc] initWithObjects:taxis,nil];
       NSMutableDictionary *towensdict=[[ NSMutableDictionary alloc]  initWithObjectsAndKeys:taxisArray,townName, nil];


       NSMutableDictionary *cities1=[[NSMutableDictionary alloc] initWithObjectsAndKeys:towensdict,cityName, nil];


NSLOG (@"%@", cities1) here, gives me the print out above


            [dictArray addEntriesFromDictionary:cities1 ];



Then I tried Jdodgers solution as follows;
   NSMutableDictionary *combinedDictionary = [[NSMutableDictionary alloc] init];
            for (NSDictionary *currentDictionary in dictArray) {
                NSArray *keys = [currentDictionary allKeys];
                 for (int n=0;n<[keys count];n++) {
                  NSMutableDictionary *dictionaryToAdd = [combinedDictionary valueForKey:[keys objectAtIndex:n]];
                if (!dictionaryToAdd) dictionaryToAdd = [[NSMutableDictionary alloc] init];
               [dictionaryToAdd setValuesForKeysWithDictionary:[currentDictionary valueForKey:[keys objectAtIndex:n]]];
               [combinedDictionary setValue:dictionaryToAdd forKey:[keys objectAtIndex:n]];

                NSLog(@"%@", currentDictionary);
                }
            } 

//这会给出错误“无法识别的选择器发送到实例”,这里是打印输出

combinedDictionary  NSMutableDictionary *   0x000000010012e580
currentDictionary   NSDictionary *const 0x0000000100116460
dictArray   NSMutableDictionary *   0x000000010012e220
[0] key/value pair  
key id  0x0000000100116460
[0] id  
value   id  0x000000010012e440
[0] id  
keys    NSArray *   0x0000000000000000

1 个答案:

答案 0 :(得分:3)

您可以创建一个NSMutableDictionary并循环遍历您的数组,使用allKeys将密钥添加到可变字典中。

例如,如果您的数组名为dictArray,则可以执行以下操作:

NSMutableDictionary *combinedDictionary = [[NSMutableDictionary alloc] init];
for (NSDictionary *currentDictionary in dictArray) {
    NSArray *keys = [currentDictionary allKeys];
    for (int n=0;n<[keys count];n++) {
        NSMutableDictionary *dictionaryToAdd = [combinedDictionary valueForKey:[keys objectAtIndex:n]];
        if (!dictionaryToAdd) dictionaryToAdd = [[NSMutableDictionary alloc] init];
        [dictionaryToAdd setValuesForKeysWithDictionary:[currentDictionary valueForKey:[keys objectAtIndex:n]]];
        [combinedDictionary setValue:dictionaryToAdd forKey:[keys objectAtIndex:n]];
    }
}

此代码首先创建一个字典combinedDictionary,它将成为您的最终字典。它遍历数组中的所有字典,每个字典都执行以下操作:

首先,它获取字典中所有键的数组。对于您提供的字典,此数组对于前3个显示为@[@"Bath"],对于其他两个显示为@[@"Birmingam"]

然后代码循环遍历这些键,并从此键中获取组合字典中已存在的字典。如果字典不存在,则创建一个字典。

然后,它从数组中添加字典中的所有值,并将新字典设置为combinedDictionary中的字典。