Совпадение нескольких строк в нескольких NSArray - PullRequest
0 голосов
/ 15 апреля 2011

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

XML содержит истории, у каждой истории есть три критерия, скажем «Fruit»'Veg', 'Spice', каждая из которых содержит одну фразу.Пример истории может выглядеть следующим образом:

<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 падает в конце цикла

Я смотрел: Отфильтровывать целые NSDictionaries из 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 ), но сила слишком большого количества информации досталась мне

1 Ответ

1 голос
/ 15 апреля 2011

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

 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
   }
...