Найти, какой массив имеет наибольшее количество - PullRequest
1 голос
/ 12 мая 2011

Как найти, какой массив является самым длинным (наибольшим числом) из трех массивов?

Справочная информация:

У меня хорошо работает соответствующая функция - три словаря с логическими значениямиЧто касается пользовательских настроек, статья имеет три категории тегов, функция проверяет, включен ли тег A в словаре A, тег B включен в словаре B и т. д.

Теперь требуется, чтобы в теге было N записейA, N записей в теге B и т. Д.

Чтобы каждый из трех массивов тегов мог иметь разную длину, самый простой способ, который я могу придумать, - это найти самый длинный массив (с большинством записей) из ArrayA,ArrayB и ArrayC

Это мой оригинальный рабочий цикл

for (id myArrayElement in storyArray) {

    NSString *myString = [NSString stringWithString:[myArrayElement industryA]];
    NSString *myIssue = [NSString stringWithString:[myArrayElement issueA]];
    NSString *myService = [NSString stringWithString:[myArrayElement serviceA]];

    if (
        [prefsDictionary valueForKeyPath:[NSString stringWithFormat:@"Industries.%@", myString]] || 
        [prefsDictionary valueForKeyPath:[NSString stringWithFormat:@"Issues.%@", myIssueElement]] || 
        [prefsDictionary valueForKeyPath:[NSString stringWithFormat:@"Services.%@", myService]]
        ) {

        // One of the story's tags matches a key in one of the corresponding dictionaries
        // Look up what this preference is set to

        NSString *keyvalue = [[prefsDictionary valueForKey:@"Industries"] valueForKey:myString];
        NSString *Issuesvalue = [[prefsDictionary valueForKey:@"Issues"] valueForKey:myIssueElement];
        NSString *Servicevalue = [[prefsDictionary valueForKey:@"Services"] valueForKey:myService];

        if (
            [keyvalue isEqualToString:@"1"] || 
            [Issuesvalue isEqualToString:@"1"] || 
            [Servicevalue isEqualToString:@"1"]
            ) {

            // It's a match, add the story
            [self.favList addObject:myArrayElement];
        }

    } // prefsDictionary End if

Я думаю, что лучший способ сделать это, когда три входа могут быть массивами любой длины, это

for (id myArrayElement in delegate.storyArray) {

    NSArray *industyArr = [[myArrayElement industryA] componentsSeparatedByString:@"|"];
    NSArray *issueArr = [[myArrayElement issueA] componentsSeparatedByString:@"|"];
    NSArray *serviceArr = [[myArrayElement serviceA] componentsSeparatedByString:@"|"];

    // We need to find longest array
    // Pad the shorter arrays, or use if ([array count] >= 4) {id obj = [scores objectAtIndex:3];}
    // Then loop using the largest array length

    for (loop longest array length) {

               // get nth entry in industyArr... thisIndustry
               // get nth entry in issueArr...   thisIssue
               // get nth entry in serviceArr... thisService

        if (
            [prefsDictionary valueForKeyPath:[NSString stringWithFormat:@"Industries.%@", thisIndustry]] || 
            [prefsDictionary valueForKeyPath:[NSString stringWithFormat:@"Issues.%@", thisIssue]] || 
            [prefsDictionary valueForKeyPath:[NSString stringWithFormat:@"Services.%@", thisService]]
            ) {

            // One of the story's tags matches a key in one of the corresponding dictionaries

            NSString *keyvalue = [[prefsDictionary valueForKey:@"Industries"] valueForKey:thisIndustry];
            NSString *Issuesvalue = [[prefsDictionary valueForKey:@"Issues"] valueForKey:thisIssue];
            NSString *Servicevalue = [[prefsDictionary valueForKey:@"Services"] valueForKey:thisService];

            if (
                [keyvalue isEqualToString:@"1"] || 
                [Issuesvalue isEqualToString:@"1"] || 
                [Servicevalue isEqualToString:@"1"]
                ) {

                // It's a match, add the story
                [self.favList addObject:myArrayElement];

                // EXIT THE INNER LOOP NOW WE HAVE A MATCH
            }
        } // prefsDictionary End if
    } // End myIssueElement for
} // End myArrayElement for

Если у кого-то нет отличной идеи ...

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Если вы просто пытаетесь убедиться, что вы просматриваете все значения в каждом массиве, я бы на самом деле поддержал nielsbot. просто вставив

MAX(arrayA.count, MAX(arrayB.count, arrayC.count))

в ваш параметр for должен охватывать его.

for( int i=0; i < MAX(arrayA.count, MAX(arrayB.count, arrayC.count)); i++ ) {
    // Blah Blah Blah
}

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

0 голосов
/ 12 мая 2011

Если все, что вы хотите сделать, это выяснить, какой массив имеет наибольшее число, я бы выбрал такой подход:

NSArray *largestArray = arrayA;
if ([largestArray count] < [arrayB count]) {
    largestArray = arrayB;
}
if ([largestArray count] < [arrayC count]) {
    largestArray = arrayC;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...