我正在尝试处理一组对象(代表游戏玩家),根据当前的组值为每个对象分配一个组号。
问题在于每个小组应该尽可能接近四个玩家,并且一些玩家希望成为特定的小组,这些小组不得被打破(但可以重命名或合并)。
有些玩家有未分配/无效的群组(他们不想与特定的人玩游戏)而其他玩家想要与特定的人玩游戏,以便他们拥有自定义群组价值。
var players = [
{name: "A", group: null},
{name: "B", group: null},
{name: "C", group: null},
{name: "D", group: null},
{name: "E", group: null},
{name: "cA", group: "custom1"},
{name: "cB", group: "custom1"},
{name: "cC", group: "custom2"},
{name: "cD", group: "custom2"},
{name: "cE", group: "custom3"},
{name: "cF", group: "custom3"}];
我需要一种方法来解析这个数组,以便它返回如下内容:
var resolvedGroup = [
{name: "A", group: 1},
{name: "B", group: 1},
{name: "C", group: 1},
{name: "D", group: 1},
{name: "cA", group: "customMerged1"},
{name: "cB", group: "customMerged1"},
{name: "cC", group: "customMerged1"},
{name: "cD", group: "customMerged1"},
{name: "cE", group: 2},
{name: "cF", group: 2},
{name: "E", group: 2}
]
你可以看到前四个玩家应该被分配到第一组,而最初拥有自定义组的玩家会被合并为四个一组,如果可能的话 - 否则,他们应该得到一些" null&# 34;分组玩家尽可能在一组中形成接近四名玩家。这些组的名称并不重要,只有指定自定义组的每个玩家都应该能够与初始组成员保持联系,即使他们与另一个自定义组合并。
答案 0 :(得分:1)
这需要几个步骤和相当数量的编码。您可能需要尝试各种方法并提出最佳解决方案。我会从:
开始1)根据玩家数量确定您需要多少组。最有可能的是Math.ceil(numPlayers / 4);
2)按该大小创建一组组。这可能就像每组中球员数量的数组一样简单。
3)按组名对播放器列表排序(使用排序和自定义比较功能)。
4)浏览排序列表,对于每个组名,计算该组中的玩家数量,找到一个有足够多个玩家空间的组,并将它们全部添加到该组中。
5)浏览剩下的玩家,将每个玩家添加到一个组中。我会从组数组的末尾开始,在添加每个播放器后向后移动,当它到达开头时循环回到组数组的末尾。
答案 1 :(得分:1)
请求的群组将属于以下类别之一:
当然,4号组可以原样保留。
大小为2的组可以相互配对 - 如果这些组中有奇数个组,则最后会留下一组。
3号组可以与未分配的玩家配对。在此步骤之后,您将拥有一些剩余的3号组或一些剩余未分配的球员,但不是两者。如果你有3个剩余的3组,那么你必须保持原样。
如果你有剩余未分配的玩家(可能还有一个剩余的2号组),你可以相对容易地将它们分成4组。
在伪代码中:
players
列表并更新字典/哈希表来在线性时间内完成。