Мне нужно объединить два NSArray/NSDictionaries вместе

У меня есть два файла plist, которые я использую в качестве источников данных для создания NSArray и NSDictionaries в своем приложении.

Я хочу, чтобы вывод файла CSV выглядел так:

exerciseName, muscleGroup, description
Barbell Curl, Biceps, This is a bicep exercise

Проблема в том, что мне нужно сначала объединить два NSDictionary, которые у меня есть. У одного есть имя упражнения и имя мышцы, а у другого — описание упражнения. Но мне нужно иметь один массив словарей для каждого объекта упражнения, который имеет все 3 ключа.

Я использую следующий код для создания основного NSMutableArray

if (muscleArray == nil)
    {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
        NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
        self.muscleArray = rootLevel;
    }

    NSMutableArray *arrayForSearching = [NSMutableArray array];
    for (NSDictionary *muscleDict in self.muscleArray)
        for (NSDictionary *excerciseDict in [muscleDict objectForKey:@"exercises"])
            [arrayForSearching addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                          [excerciseDict objectForKey:@"exerciseName"], @"exerciseName",
                                          [muscleDict objectForKey:@"muscleName"], @"muscleName", nil]];
    self.exerciseArray = arrayForSearching;

Я использую следующий код для создания NSDictionary, который имеет ключ trainingDescription

    NSString *exerciseNameString =self.exerciseName;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions" ofType:@"plist"];

    NSDictionary *exerciseDescription = [NSDictionary dictionaryWithContentsOfFile:path];
    NSString *description = [exerciseDescription objectForKey:exerciseNameString];

person Jon    schedule 09.12.2011    source источник
comment
Мне не ясно, в чем заключается ваш вопрос.   -  person ThomasW    schedule 09.12.2011


Ответы (2)


Вы, очевидно, знаете, как перебирать и создавать словари, так в чем проблема?

Переберите exerciseArray и добавьте описание упражнения в каждый из его словарей. Однако это кажется дико неэффективным, и вам, вероятно, следует переосмыслить все это. Почему бы не хранить их на диске в готовом к использованию формате?

Массивы используются, когда порядок элементов имеет значение. Кажется, здесь это не имеет большого значения, так почему бы просто не сохранить их как NSDictionaries? Если вам нужно получить доступ ко всем ключам в словаре, просто вызовите allKeys

РЕДАКТИРОВАТЬ: Вот так?

NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions"
    ofType:@"plist"];
NSDictionary *descriptions = [NSDictionary dictionaryWithContentsOfFile:path];

NSMutableArray *exercises = self.exerciseArray;
for (NSInteger i = 0; i < [exercises count]; i++) {

    NSMutableDictionary *dict = [[exercises objectAtIndex:i] mutableCopy];
    NSString *name = [dict valueForKey:@"exerciseName"];
    NSString *desc = [descriptions valueForKey:name];

    if (desc) {
        [dict setValue:desc forKey:@"exerciseDescription"];
        [exercises replaceObjectAtIndex:i withObject:dict];
    }
    [dict release];
}
person Francis McGrew    schedule 09.12.2011

Я создал следующий проект, чтобы удовлетворить потребность в объединении двух словарей, созданных из plist: https://github.com/bumboarder6/NSDictionary-merge

Он работает, даже если у вас есть повторяющиеся записи между двумя вашими словарями или массивами, а также рекурсивно объединяется, поэтому вы получаете слияние всего вашего plist, даже если он содержит словари словарей массивов словарей (и т. д.).

person Mathew    schedule 18.01.2013