2013-09-14 5 views
3

У меня есть следующий результат NSDictionary массиваIos 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 

ответ

3

Вы купили ld создайте 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"] для двух других.

Код затем проходит через эти ключи и получает уже существующий словарь из комбинированного словаря из этого ключа. Если словарь не существует, он создается.

Затем он добавляет все значения из словаря из массива и устанавливает новый словарь в combinedDictionary.

+0

спасибо, но я продолжаю получать нераспознанный селектор, отправленный в экземпляр – user1430825

+0

Я добавил более подробную информацию, потому что я продолжаю получать непризнанную ошибку выбора – user1430825

+0

Ваш dictArray должен быть массивом, а не словарем. Это массив словарей, которые вы комбинируете (например, он может содержать ваши пять примерных словарей каждый как объект массива). – Jsdodgers

Смежные вопросы