数组中的数组(二维数组?)

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)]]