Объединение значений с одним и тем же ключом в NSMutableDictionary

#ios #objective-c #cocoa-touch

#iOS #objective-c #cocoa-touch

Вопрос:

Я получаю данные из своей базы данных, и данные извлекаются с помощью цикла while.

 success = [db executeQuery:@"SELECT * FROM apidataTwo;"];

while([success next]){

    int first = [success intForColumn:@"id"];
    NSString *id = [NSString stringWithFormat:@"%d",first];
    [_tempArray addObject:id];

    NSString *country_name = [success stringForColumn:@"country_name"];
    [_tempArray addObject:country_name];

    NSString *breezometer_description = [success stringForColumn:@"breezometer_description"];
    [_tempArray addObject:breezometer_description];

    NSString *country_description = [success stringForColumn:@"country_description"];
    [_tempArray addObject:country_description];

    NSString *dateString= [success stringForColumn:@"dateString"];
    [_dateSectionArray addObject:dateString];

    [_dataDictionary setObject:_tempArray forKey:dateString];

}
  

Предположим, мы получаем один и тот же ключ в разных итерациях цикла. Когда я передаю массив в NSMutableDictionary , предыдущие значения будут заменены и потеряны.

И если я продолжу обновлять NSMutableArray , то значения предыдущего ключа также будут добавлены к другому ключу.

Итак, в подобных ситуациях, когда мы хотим объединить значения с одним и тем же ключом, каким должен быть наш подход.

Словарь должен выглядеть следующим образом:

 {
  2016-10-05" =     (
      5,
      "United States",
      "Fair Air Quality",
      "Good air quality"
  );
  "2016-10-06" =     (
      5,
      "United States",
      "Fair Air Quality",
      "Good air quality"
  );
}
  

Комментарии:

1. if (_dataDictionary[dateString]){[(NSMutableArray*)_dataDictionary[dateString] addObjects:theNotIncremetingArray]}else{[_dataDictionary setObject:theNotIncremetingArray forKey:dateString];} ?

2. @Larme Массив, который я, как вы сказали, использовал, должен быть неизменяемым?

3. Если вы хотите изменить addObjects: его, он должен быть изменяемым. Я опубликовал то, что, как я мог понять, было вашим вопросом, потому что это довольно неясно с «продолжать увеличивать массив».

4. @Larme Массив, в котором я храню строковые значения из базы данных, является изменяемым, поэтому после каждой итерации добавляются новые значения, и это становится значением даже для тех ключей, которые я не хочу.

5. В конце вы хотите, чтобы все ваши данные _dataDictionary были включены, если их больше за тот же день, вы помещаете их в один и тот же массив для ключа dateString ? Дело в том, что непонятно, почему вы добавляете id country_name и т.д. в массив, а не в словарь.

Ответ №1:

После того, как вы определили ключ для этого пакета данных, попробуйте извлечь объект из словаря для этого ключа. Если objectForKey: возвращает nil , то создайте новый изменяемый массив. Затем установите этот массив в качестве объекта словаря для этого ключа.

Затем каждый новый пакет данных добавляется в массив, а не в словарь. Вот набросок структуры:

 while( /* processing data */){

    // Collect this batch
    NSArray * entry = ...;
    // Figure out the dictionary key for the batch.
    // (it doesn't have to be a string, this is just for example)
    NSString * key = ...;

    // Try to retrieve the object for that key
    NSMutableArray * entries = _dataDictionary[key];

    // If the result is `nil`, the key is not in the dictionary yet.
    if( !entries ){

        // Create a new mutable array
        entries = [NSMutableArray array];
        // Add that to the dictionary as the value for the given key
        _dataDictionary[key] = entries;
    }

    // Now `entries` is a valid `NSMutableArray`, whether it already
    // existed or was just created. Add this batch.
    [entries addObject:entry];

    // Move on to the next batch.
}
  

Комментарии:

1. @JoshCorwell Где мы добавляем значения из массива записей в ключ словаря. Должны ли мы добавлять значения из ключа после последней строки?

2. Вверху вы добавляете отдельные значения entry . Затем вы добавляете entry в entries . entries уже есть в словаре.

3. Но где вы добавили записи в словарь. Точка, в которой вы добавили, — это место, где значение массива записей равно нулю.

4. В строке 23 в моем примере, [entries addObject:entry]; , entries нет nil . Он либо извлекается из словаря, либо создается внутри оператора if.