Поиск наиболее распространенного массива в NSObject

У меня есть NSObject "TeamStats", который содержит массив объектов "Possession". Объекты «Владение» содержат массив «Игроки»... Для каждой «Игры» также создается «TeamStats». Два свойства объекта «Владение» — это didEndInTurnover и didEndInScore. Что мне нужно сделать, так это найти наиболее распространенный набор игроков во владении, который сделал EndInScore и сделалEndInTurnover...

Как лучше всего подойти к этому?


person Luke    schedule 06.03.2013    source источник
comment
Хороший чат: P, но не понял вопроса.   -  person Anoop Vaidya    schedule 06.03.2013
comment
Есть ли неограниченная комбинация игроков, или есть вероятность, что группа игроков всегда будет вместе? Другими словами, вы смотрите на игроков по отдельности или пытаетесь сравнить что-то вроде первой и второй линии, отряда А и отряда Б или что-то в этом роде, когда группа игроков всегда собирается быть вместе?   -  person GeneralMike    schedule 06.03.2013
comment
@GeneralMike да, это именно то, к чему я стремлюсь, сравнивая отряд A и отряд B, но, по сути, я пытаюсь сравнить каждый отряд, который появился во время игрового объекта, и найти отряд, который произвел больше всего оборотов ... Имеет ли это смысл? ?   -  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