【问题标题】:Finding most common array within an NSObject在 NSObject 中查找最常见的数组
【发布时间】:2013-02-21 09:07:13
【问题描述】:

我有一个 NSObject“TeamStats”,它包含一个“Possession”对象数组。 “Possession”对象包含一个“Players”数组......对于每个“Game”,也都会创建一个“TeamStats”。 “Possession”对象的两个属性是 didEndInTurnover 和 didEndInScore。我需要做的是在一个回合中找到最常见的一组球员,即 didEndInScore 和 didEndInTurnover...

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 很好的聊天:P,但没有得到问题。
  • 玩家组合是无限的,还是有可能一群玩家永远在一起?换句话说,您是单独查看球员,还是尝试比较诸如 Line 1 与 Line 2、Squad A 与 Squad B 之类的东西,或者像一群玩家总是在一起的东西?跨度>
  • @GeneralMike 是的,这正是我想要的,比较小队 A 和小队 B,但基本上我试图比较在游戏对象中出现的每个小队,并找到生产最多的小队失误……这有意义吗?

标签: objective-c sorting nsarray filtering nsobject


【解决方案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 ...
    }
}

【讨论】:

  • 感谢您的评论,虽然我不认为硬编码所有的 NSArray 都适用于我的情况,因为在一场比赛中可能有无限数量的小队,例如如果有 5 名玩家在玩一个代表一个小队的游戏,如果一个球员替补该小队的一名球员,它就会变成一个新小队......这有意义吗?
  • @Luke:好的,那么在这种情况下,您必须使用我在第三段中提到的字典方法。这样,当你创建一个新的小队或其他东西时,你就可以在字典中添加一个新条目。
  • @Luke:K,刚刚添加了巨大的代码块,其中包含它需要的样子。我在这里假设你只对它是否以营业额或得分结束感兴趣。如果还有其他情况,您需要在每个循环内添加一个新字典和一个新的else if
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2013-09-05
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多