数组中的数组(二维数组?)
Array within an Array (2D Array?)
标题可能不清楚,我不确定如何在没有具体细节的情况下阐明这个想法,所以这里是概要:
我的代码有一个 Players
的数组(一个 class 我写的)。我想在给定数量的团队之间平均拆分数组中的条目(基于它们的 Players.rating
)。问题出现了,团队的数量是一个 var teamAmount
,可以设置在 2 到 8 之间。我试图找到一种创建多个 Player
class 数组的简单方法等于 teamAmount
的值(无需编写 7 个 switch case)。我在想一个二维数组,但我想不出如何初始化它。我觉得它可以很简单,但我似乎无法解决
我在下面发布了一些伪代码。你必须修改它以适应 Swift 语法 (我现在不在 Mac 中,当我把它扔进一个游乐场。)
func generate2DArray(players: Array<Player>, numTeams: Int) -> Array<Array<String>>{
var teams = Array<Array<Player>>()
for index in 0...numTeams{
//init the first dimension of empty arrays for each team
teams.append([Player]())
}
for var i = 0; i < players.count; ++i{
//Place the player in the correct team respectively... (sorry about array syntax, I know its wrong)
teams[i % numTeams].append(players[i]);
}
return teams;
}
基本思路是你知道你想要多少支球队,你可以用一个简单的 for 循环初始化二维数组的第一个维度。
然后把球员放在各自的队伍里,用魔法模数就可以了。
理论
- 玩家 1 % 4 队 = 属于队 1。
- 玩家 2 % 4 球队 = 属于球队 2
- 玩家 3 % 4 队 = 属于队 3。
- 玩家 4 % 4 队 = 属于队 0。
- 玩家 5 % 4 队 = 属于队 1。
- 球员 6 % 4 球队 = 属于球队 2。
- 玩家 7 % 4 队 = 属于第 3 队。
- 玩家 8 % 4 队 = 属于队 0。
(因为 4 % 4 是 0,你将不得不偏移你的数组,或者提供一些简单的逻辑来涵盖这种情况,最简单的是让团队 0 而不是团队 4)
更新
刚刚注意到您希望它们按玩家评分平均分配。在这种情况下,只需确保在将球员放入团队 之前按他们的评分对他们进行排序(假设您知道如何对 [=61= 中的数组进行排序,我将省略展示如何做到这一点) ], 如果需要帮助请评论。)
更新
我测试了我添加的代码并进行了一些修改,使其在Swift
中正常运行
这是预期的结果
generate2DArray([player1, player2, player3, player4, player5, player6], 2)
//Returns [player1, player3, player5] , [player2, player4, player6]
generate2DArray([player1, player2, player3, player4, player5, player6], 4)
//Returns [player1, player5] , [player2, player6] , [player3] , [player4]
这里有一个选项供您选择:
// e.g. setting up Player(s)
struct Player {
var rating = 0
}
let players = [Player(rating: 1), Player(rating: 3), Player(rating: 2), Player(rating: 7), Player(rating: 5), Player(rating: 4), Player(rating: 3)]
let sortedPlayers = players.sort { [=10=].rating > .rating }
print(sortedPlayers)
// [Player(rating: 7), Player(rating: 5), Player(rating: 4), Player(rating: 3), Player(rating: 3), Player(rating: 2), Player(rating: 1)]
// e.g. setting up Team(s)
let numberOfTeams = 3
typealias Team = [Player]
// now do the work
let teams = sortedPlayers.enumerate().reduce(
Array(count: numberOfTeams, repeatedValue: Team()),
combine: { (var teams, let player) in
let (playerIndex, player) = player
teams[playerIndex % numberOfTeams].append(player)
return teams
}
)
print(teams)
// [[Player(rating: 7), Player(rating: 3), Player(rating: 1)], [Player(rating: 5), Player(rating: 3)], [Player(rating: 4), Player(rating: 2)]]
标题可能不清楚,我不确定如何在没有具体细节的情况下阐明这个想法,所以这里是概要:
我的代码有一个 Players
的数组(一个 class 我写的)。我想在给定数量的团队之间平均拆分数组中的条目(基于它们的 Players.rating
)。问题出现了,团队的数量是一个 var teamAmount
,可以设置在 2 到 8 之间。我试图找到一种创建多个 Player
class 数组的简单方法等于 teamAmount
的值(无需编写 7 个 switch case)。我在想一个二维数组,但我想不出如何初始化它。我觉得它可以很简单,但我似乎无法解决
我在下面发布了一些伪代码。你必须修改它以适应 Swift 语法 (我现在不在 Mac 中,当我把它扔进一个游乐场。)
func generate2DArray(players: Array<Player>, numTeams: Int) -> Array<Array<String>>{
var teams = Array<Array<Player>>()
for index in 0...numTeams{
//init the first dimension of empty arrays for each team
teams.append([Player]())
}
for var i = 0; i < players.count; ++i{
//Place the player in the correct team respectively... (sorry about array syntax, I know its wrong)
teams[i % numTeams].append(players[i]);
}
return teams;
}
基本思路是你知道你想要多少支球队,你可以用一个简单的 for 循环初始化二维数组的第一个维度。
然后把球员放在各自的队伍里,用魔法模数就可以了。
理论
- 玩家 1 % 4 队 = 属于队 1。
- 玩家 2 % 4 球队 = 属于球队 2
- 玩家 3 % 4 队 = 属于队 3。
- 玩家 4 % 4 队 = 属于队 0。
- 玩家 5 % 4 队 = 属于队 1。
- 球员 6 % 4 球队 = 属于球队 2。
- 玩家 7 % 4 队 = 属于第 3 队。
- 玩家 8 % 4 队 = 属于队 0。
(因为 4 % 4 是 0,你将不得不偏移你的数组,或者提供一些简单的逻辑来涵盖这种情况,最简单的是让团队 0 而不是团队 4)
更新
刚刚注意到您希望它们按玩家评分平均分配。在这种情况下,只需确保在将球员放入团队 之前按他们的评分对他们进行排序(假设您知道如何对 [=61= 中的数组进行排序,我将省略展示如何做到这一点) ], 如果需要帮助请评论。)
更新
我测试了我添加的代码并进行了一些修改,使其在Swift
中正常运行这是预期的结果
generate2DArray([player1, player2, player3, player4, player5, player6], 2)
//Returns [player1, player3, player5] , [player2, player4, player6]
generate2DArray([player1, player2, player3, player4, player5, player6], 4)
//Returns [player1, player5] , [player2, player6] , [player3] , [player4]
这里有一个选项供您选择:
// e.g. setting up Player(s)
struct Player {
var rating = 0
}
let players = [Player(rating: 1), Player(rating: 3), Player(rating: 2), Player(rating: 7), Player(rating: 5), Player(rating: 4), Player(rating: 3)]
let sortedPlayers = players.sort { [=10=].rating > .rating }
print(sortedPlayers)
// [Player(rating: 7), Player(rating: 5), Player(rating: 4), Player(rating: 3), Player(rating: 3), Player(rating: 2), Player(rating: 1)]
// e.g. setting up Team(s)
let numberOfTeams = 3
typealias Team = [Player]
// now do the work
let teams = sortedPlayers.enumerate().reduce(
Array(count: numberOfTeams, repeatedValue: Team()),
combine: { (var teams, let player) in
let (playerIndex, player) = player
teams[playerIndex % numberOfTeams].append(player)
return teams
}
)
print(teams)
// [[Player(rating: 7), Player(rating: 3), Player(rating: 1)], [Player(rating: 5), Player(rating: 3)], [Player(rating: 4), Player(rating: 2)]]