Мне нужно объединить два NSArray / NSDictionaries вместе - PullRequest
1 голос
/ 09 декабря 2011

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

Я хочу, чтобы вывод файла CSV выглядел следующим образом:

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

Проблема в том, что мне нужно сначала объединить два имеющихся у меня словаря NSD. У одного есть имя упражнения и имя мышцы, а у другого - описание упражнения. Но мне нужно иметь один массив словарей для каждого объекта упражнения, который имеет все 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, у которого есть ключ exercDescription

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

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

Ответы [ 2 ]

0 голосов
/ 19 января 2013

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

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

0 голосов
/ 09 декабря 2011

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

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

Массивы используются, когда порядок элементов имеет значение.Здесь это не имеет большого значения, так почему бы не оставить их в качестве словарей NS?Если вам нужен доступ ко всем ключам в словаре, просто наберите 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];
}
...