2013-03-06 1 views
0

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

Каков наилучший способ приблизиться к этому?

+2

Хороший чат: P, но не понял вопрос. –

+0

Есть ли неограниченная комбинация игроков, или, вероятно, группа игроков всегда будет вместе? Другими словами, вы смотрите на игроков по отдельности или пытаетесь сравнить что-то вроде Line 1 vs Line 2 или Squad A vs Squad B или что-то в этом роде, где группа игроков всегда будет вместе? – GeneralMike

+0

@GeneralMike да, это именно то, что я собираюсь, сравнивая команду A vs Squad B, но по существу я пытаюсь сравнить каждую команду, появившуюся во время игрового объекта, и найти отряд, который произвел самые обороты ... Это делает смысл? – Luke

ответ

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 объектов в этом л. oop, сначала проверьте didEndInTurnover. Затем вам нужны целочисленные переменные для каждого отряда и каждый didEndIn... (так что-то вроде int squadAScore, int squadBScore, int squadATurnover, int squadBTurnover и т. Д.). Когда вы зацикливаетесь, проверьте, какая команда была активна для этого владения, и увеличьте счетчик целых чисел для этого отряда, если это необходимо. Наконец, просто сравните свои целые счетчики, как только вы зациклились на всех предметах, чтобы узнать, какой из них больше.

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

Ну, я не знаю, является ли это понятным или нет. Если это действительно не имеет смысла, я мог бы попытаться ввести код того, что будет выглядеть в цикле, просто дайте мне знать.

EDIT: Вот некоторые примеры того, что цикл будет выглядеть, используя словари:

// 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 ... 
    } 
} 
+0

Спасибо за ваш комментарий, хотя я не думаю, что жесткая кодировка всех NSArrays будет работать в моем случае, потому что во время игры может быть бесконечное количество отрядов, например, если в игре играют 5 игроков, которые обозначают одну команду, если один игрок присоединяется к игроку в этом отряде, он становится новым отрядом ... Это имеет смысл? – Luke

+0

@ Luke: Хорошо, поэтому в этом случае вам придется перейти к методу словаря, о котором я упомянул в третьем абзаце. Таким образом, вы сможете просто вставить новую запись в словарь при создании нового отряда или чего-то еще. – GeneralMike

+0

@ Luke: K, просто добавил огромный блок кода, с которым это должно выглядеть. Я предполагаю, что вас интересует только то, заканчивается ли оборот или оценка.Если есть другие случаи, вам нужно будет добавить новый словарь и новый 'else if' внутри цикла для каждого. – GeneralMike