Сопоставление нескольких строк в нескольких NSArray

Мне нужно выбрать истории из массива NSArray XML, сопоставив строку из элемента XML со списком строк в другом массиве NSArray.

XML содержит истории, каждая история имеет три критерия, например «Фрукты», «Вегетарианские овощи», «Приправы», каждый из которых содержит одну фразу. Примерная история может выглядеть так:

<story>
    <title>I love cooking</title>
    <fruit>Oranges</fruit>
    <veg>Cauliflower</veg>
    <spice>Mixed spice</spice>
    <blurb>losts of text and stuff....</blurb>
</story>

У меня есть три словаря пар ключ / значение в NSMutableDictionary, созданном из pList

<Fruit:dictionary>
    'Ripe bananas' : 1
    'Green bananas' : 0
<Veg:dictionary>
    'Green beans' : 1
    'Cauliflower' : 0
<Spice:dictionary>
    'Nutmeg' : 1
    'Mixed spice' : 0

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

например, тег фруктов истории: «Спелые бананы» СООТВЕТСТВУЮТ «Спелым бананам» в списке ключевых фруктов.

Я могу построить три массива ключей, используя

NSMutableDictionary *fruitTagsDict = [prefsDictionary objectForKey:@"Fruits"];
NSArray *fruitTags = [fruitTagsDict allKeys];

Я просматриваю историю XML, извлекая тег

for (id myArrayElement in storyArray) {
    NSString *fruitString = [NSString stringWithString:[myArrayElement fruit]];
    //BOOL isTheObjectThere = [issueTags containsObject:fruitString];

    NSString *vegString = [NSString stringWithString:[myArrayElement veg]];

    NSString *spiceString = [NSString stringWithString:[myArrayElement spice]];

    //if ([[fruitTags objectAtIndex:row] isEqualToString:fruitString]) {
    //NSLog(@"Yo %@", fruitString);
            // ADD TO A NEW ARRAY OF MATCHING STORIES
    //}
        // Fails because row is undeclared
}

Затем я начинаю тускнеть.

Строка isTheObjectThere производит nil, а затем вылетает в конце цикла

Я посмотрел на: Отфильтровать целые словари NS из NSArray на основе нескольких ключей Проверка кода, чтобы увидеть, соответствует ли текст в текстовом поле какой-либо из строк в массиве NSArray

Кажется, что предикат - это ответ, но, честно говоря, я запутался.

Что мне нужно сделать в метакоде

repeat with stories
    if storyFruitTag is in fruitTagArray 
    OR storyVegTag is in vegTagArray 
    OR storySpiceTag is in spiceTagArray
        Add to new array of matching stories

Надеюсь, я объяснил достаточно, чтобы получить некоторые указатели, я изучил NSMutableSet и Intersect (Xcode: Сравните два NSMutableArrays) но сила слишком большого количества информации попала в меня


person JulianB    schedule 14.04.2011    source источник


Ответы (1)


Вот простой способ определить, есть ли совпадения, используя ключевые пути:

 if ([prefsDict valueForKeyPath:[NSString stringWithFormat:@"Fruit.%@", storyFruitTag]] ||
     [prefsDict valueForKeyPath:[NSString stringWithFormat:@"Veg.%@", storyVegTag]] ||
     [prefsDict valueForKeyPath:[NSString stringWithFormat:@"Spice.%@", storySpiceTag]]) {
       // one of the story's tags matches a key in one of the corresponding dictionaries
   }
person Art Gillespie    schedule 14.04.2011