Ios NSDictionary array - grouping values and keys

2019-05-18 01:03发布

问题:

I have the following result of NSDictionary of Array

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"
    );
};

How can i combine the values and keys so that I end up with only one category as shown below;

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

   Keynsham =         (
        "nsham companies"
    );

};

I am not sure if this is the best way to explain it the code is as follows

//all Nssarrays allocated/ initialised

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

//this gives error "unrecognized selector sent to instance", here is the print out

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:

You could create an NSMutableDictionary and loop through your array, adding the keys to the mutable dictionary using the allKeys.

For example, if your array was called dictArray, you could do:

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

This code first creates a dictionary combinedDictionary that will be your final dictionary. It loops through all of the dictionaries in your array and for each one does the following:

First, it gets an array of all keys in the dictionary. For the dictionaries you provided this array will look like @[@"Bath"] for the first 3 and @[@"Birmingam"] for the other two.

The code then loops through these keys and gets the already existing dictionary from the combined dictionary from this key. If the dictionary doesn't exist, one is created.

Then, it adds all of the values from the dictionary from the array and sets the new dictionary to be the one in combinedDictionary.