3

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

以下に示すように、値とキーを組み合わせて、最終的に 1 つのカテゴリだけになるようにするにはどうすればよいですか。

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
4

1 に答える 1

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に、最終的な辞書となる辞書を作成します。配列内のすべての辞書をループし、それぞれに対して次のことを行います。

まず、辞書内のすべてのキーの配列を取得します。あなたが提供した辞書の場合、この配列は@[@"Bath"]最初の 3@[@"Birmingam"]つと他の 2 つのようになります。

次に、コードはこれらのキーをループし、このキーから結合された辞書から既存の辞書を取得します。ディクショナリが存在しない場合は、作成されます。

次に、配列のディクショナリのすべての値を追加し、新しいディクショナリを のディクショナリに設定しcombinedDictionaryます。

于 2013-09-14T07:08:48.333 に答える