Намиране на най-често срещания масив в NSObject

Имам NSObject „TeamStats“, който съдържа масив от обекти „Possession“. Обектите "Притежание" съдържат масив от "Играчи"... За всяка "Игра" има създадена и "Отборна статистика". Две свойства на обекта „Притежание“ са didEndInTurnover и didEndInScore. Това, което трябва да направя, е да намеря най-често срещания набор от играчи в рамките на притежание, което е направило EndInScore и didEndInTurnover...

Какъв е най-добрият начин да се подходи към това?


person Luke    schedule 06.03.2013    source източник
comment
Приятен чат :P, но не разбрах въпроса.   -  person Anoop Vaidya    schedule 06.03.2013
comment
Има ли неограничена комбинация от играчи или е вероятно група играчи винаги да са заедно? С други думи, гледате ли играчите поотделно, или се опитвате да сравните нещо като Линия 1 срещу Линия 2, или Отряд А срещу Отбор Б, или нещо подобно, където група играчи винаги ще бъдат заедно?   -  person GeneralMike    schedule 06.03.2013
comment
@GeneralMike да, точно към това се стремя, сравнявайки отбор А срещу отбор Б, но по същество се опитвам да сравня всеки отбор, появил се по време на игровия обект, и да намеря отбора, който произвежда най-много обороти... Има ли смисъл в това ?   -  person Luke    schedule 06.03.2013


Отговори (1)


Добре, като начало, бих опростил това малко, като заменя масива от играчи с нова променлива NSString, която просто казва за кой отбор са тези данни (така че ще имате променлива NSString *squadName (и бихте задали posession1.squadName = @"Squad A" или нещо подобно ) като свойство на вашия Possession обект, вместо масива от играчи. Ако искате да отпечатате имена или номера на играчи, винаги можете да настроите масив или речник някъде другаде, който съдържа тази информация за отпечатване на екрана - нещо като

NSArray squad1Array = [NSArray arrayWithObjects:@"Bill",@"Tom",@"Joe",nil];
NSArray squad2Array = [NSArray arrayWithObjects:@"Jim",@"Jeff",@"Mike",nil];

След като настроите отрядите, ще трябва да преминете през масива от Possession обекта. В този цикъл първо проверете didEndInTurnover. След това имате нужда от целочислени променливи за всеки отряд и всеки didEndIn... (така че нещо като int squadAScore, int squadBScore, int squadATurnover, int squadBTurnover и така нататък). Когато преминавате през цикъл, проверете кой отбор е бил активен за това притежание и увеличете брояча на целите числа за този отбор, както е подходящо. И накрая, просто сравнете вашите броячи на цели числа, след като прегледате всички притежания, за да видите кое е най-голямото.

Обърнете внимание, че ако искате да организирате това малко по-добре или да го направите по-гъвкаво и по-малко кодирано, вероятно бихте могли да разгледате използването на вложени NSDictionaries вместо целочислените броячи - ще отнеме малко повече работа, за да настроите като речници, но ако трябва да добавите нов отбор по-късно или нещо подобно, може да е по-лесно да правите подобни промени в бъдеще.

Е, не знам дали нещо от това е разбираемо или не. Ако наистина няма смисъл, мога да се опитам да сложа някакъв код за това как приблизително ще изглежда цикълът, просто ме уведомете.

РЕДАКТИРАНЕ: Ето някои примери за това как ще изглежда цикълът, използвайки речниците:

// Define counters for squads
NSMutableDictionary *turnoverDictionary = [[NSMutableDictionary alloc] init];
NSMutableDictionary *scoreDictionary = [[NSMutableDictionary alloc] init];

// Loop over all possessions
for (YourPossessionClass *currentPossession in myTeamStats.possessionArry)
{
    if (currentPossession.didEndInTurnover == YES)
    { 
        BOOL found = NO;
        for (NSString *squad in [turnoverDictionary allKeys])
        {
            if ([squad isEqualToString:currentPossession.squad])
            {
                int count = [[turnoverDictionary objectForKey:squad] intValue];
                count ++;
                NSNumber *newCount = [NSNumber numberWithInteger:count];
                [turnoverDictionary setObject:newCount ForKey:squad];
                found = YES;
            }
            //else {Do Nothing - this isn't the squad we want}
        }

        // Add a new entry to the dictionary for this squad if this squad didn't exist before
        if (!found)
        {
            [turnoverDictionary setObject:[NSNumber numberWithInt:0] forKey:currentPossession.squad];
        }
        //else {Do Nothing - squad was already in dictionary}
    }
    else if {currentPossession.didEndInScore == YES}
    {
        // ... Do all the same stuff as we did for turnover, except now add them to the scoreDictionary instead of the turnoverDictionary ...
    }
}
person GeneralMike    schedule 06.03.2013
comment
Благодаря за коментара ви, въпреки че не мисля, че твърдото кодиране на всички NSArrays ще работи в моя случай, защото може да има безкраен брой отбори по време на игра, например ако 5 играча играят в игра, която обозначава един отбор, ако един играч замества играч от този отбор, той става нов отбор... Има ли смисъл в това? - person Luke; 06.03.2013
comment
@Luke: Добре, така че в такъв случай ще трябва да отидете на метода на речника, който споменах в третия параграф. По този начин ще можете просто да маркирате нов запис в речника, когато създавате нов отбор или нещо подобно. - person GeneralMike; 06.03.2013
comment
@Luke: K, току-що добави огромния кодов блок с това как трябва да изглежда. Предполагам тук, че се интересувате само дали завършва с обрат или резултат. Ако има други случаи, ще трябва да добавите нов речник и нов else if вътре в цикъла за всеки. - person GeneralMike; 06.03.2013