创建具有给定数量团队的团队生成器
Posted
技术标签:
【中文标题】创建具有给定数量团队的团队生成器【英文标题】:Create a team generator with a given number of teams 【发布时间】:2021-05-25 16:24:25 【问题描述】:我想获取[String]
的数组并将其分成给定数量的组。
我尝试过使用这个扩展
extension Array
func chunked(into size: Int) -> [[Element]]
return stride(from: 0, to:count, by: size).map
Array(self[$0 ..< Swift.min($0 + size, count)])
将数组拆分为每个子数组给定数量的元素,这对于该函数有效。
但是为了将其拆分为所需数量的子数组,我尝试将array.count
除以所需的团队数量,这仅在某些情况下有效。
如果有任何额外的元素,它会在最后将它们放入一个额外的子数组中,即使我希望它完美地工作,这个数字也需要出来,这只是少数情况。
所以我猜这个array.chunked
函数无论如何都不是解决方案。
也许有一种方法可以通过 for 循环来实现,方法是获取 array.randomElement()
,将其添加到变量(这将是一个团队),然后从原始数组中删除该元素,并对其进行迭代,直到原始数组为空。最后得到一组子数组,这些子数组将是团队,或者只是单独的变量,这些变量将是团队。可以是这些选项中的任何一个。
关于如何做到这一点的任何想法?
【问题讨论】:
没有任何挑选策略可以让您将奇数人分成两个大小相等的团队。这是不可能的。您可能做的最接近的可能是获取“剩余”(Array.chunked(into:)
返回的最后一个子数组),并将这些球员分配给现有球队,以便球队规模最多相差 1
@Alexander 是的,这就是我的想法。问题在于,有时超过 1 个数组最终会成为多余的,而 Array.chunked(into:) 函数只是设置了每个数组可以包含多少元素的限制。
要随机挑选团队成员吗?
@DuncanC 是的,但我可以将数组作为 .shuffled() 传递。
【参考方案1】:
想想你如何发牌。
如果您有 7 名玩家,则从一名玩家开始,然后四处走动,一次给每个玩家一张牌。最后,您可能会在给每个人相同数量的牌之前用完牌。有些人可能有 n 张卡,有些人可能有 n-1 张。这是你能做的最好的。
您可以使用源数组和目标数组实现相同的功能。从源数组中一次删除一个元素,然后“循环”将其添加到目标数组之一,直到源数组用完为止。
该代码可能如下所示:
func splitArray<T>(array: [T], subArrayCount: Int) -> [[T]]
// Create an empty array of arrays
var result = [[T]]()
// Create the empty inner string arrays
for _ in 1...subArrayCount
let innerArray = [T]()
result.append(innerArray)
for (index, element) in array.enumerated()
result[index % subArrayCount].append(element)
return result
并对其进行测试:
let string = "Now is the time for all good programmers to babble incoherently. The rain in spain falls mainly on the plain. Fourscore and seven years ago our forefathers brought forth to this continent a new nation conceived in liberty and dedicated to the cause that all men are created equal."
let array = string.split(separator: " ")
.map String($0)
let subArrays: [[String]] = splitArray(array: array, subArrayCount: 5)
for (index, array) in subArrays.enumerated()
let countString = String(format: "%2d", array.count)
print ("Array[\(index)]. Count = \(countString). Contents = \(array)")
该测试的输出是:
Array[0]. Count = 10. Contents = ["Now", "all", "incoherently.", "falls", "Fourscore", "our", "this", "conceived", "to", "men"]
Array[1]. Count = 10. Contents = ["is", "good", "The", "mainly", "and", "forefathers", "continent", "in", "the", "are"]
Array[2]. Count = 10. Contents = ["the", "programmers", "rain", "on", "seven", "brought", "a", "liberty", "cause", "created"]
Array[3]. Count = 10. Contents = ["time", "to", "in", "the", "years", "forth", "new", "and", "that", "equal."]
Array[4]. Count = 9. Contents = ["for", "babble", "spain", "plain.", "ago", "to", "nation", "dedicated", "all"]
【讨论】:
所以我应该做一个for循环来不断地将源数组中的一个元素添加到其他数组中?如何告诉 for 循环应该将元素添加到哪个数组?还是有更好的方法? 我在第二个 for 循环的声明中遇到错误,提示“元组模式无法匹配非元组类型‘字符串’的值”。我该如何解决这个问题? 是的。我应该比在 SO 编辑器中键入代码更清楚。我更新了我的答案。 我重构了函数以使用泛型,所以它会拆分任何类型的数组。以上是关于创建具有给定数量团队的团队生成器的主要内容,如果未能解决你的问题,请参考以下文章
生成具有给定元素数量和错误级别的已定义 Min、Max、Mean 和 Stdev 的随机数数组