在NSObject中查找最常见的数组

时间:2013-03-06 14:16:38

标签: objective-c sorting nsarray filtering nsobject

我有一个NSObject“TeamStats”,它包含一系列“占有”对象。 “占有”对象拥有一系列“玩家”...对于每个“游戏”,也会创建一个“TeamStats”。 “占有”对象的两个属性是didEndInTurnover和didEndInScore。我需要做的是找到最常见的玩家阵容,其中包括EndInScore和didEndInTurnover ......

最好的方法是什么?

1 个答案:

答案 0 :(得分: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 squadAScoreint squadBScoreint squadATurnoverint 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 ...
    }
}