【问题标题】:Array within an Array (2D Array?)数组中的数组(二维数组?)
【发布时间】:2015-08-11 21:45:20
【问题描述】:

标题可能不清楚,我不确定如何在没有细节的情况下表达这个想法,所以这里是纲要:

我的代码有一个Players 数组(我写的一个类)。我想在给定数量的团队之间平均分配数组中的条目(基于它们的Players.rating)。问题出现了,团队的数量是一个 var teamAmount 并且可以设置在 2 到 8 之间。我试图找到一种简单的方法来创建多个 Player 类数组等于 teamAmount 的值(无需编写 7 个 switch 案例)。我在想一个二维数组,但我想不出如何初始化它。我觉得它可能很简单,但我似乎无法解决它

【问题讨论】:

  • 我更新了我的帖子,现在应该可以使用了。

标签: ios arrays class swift2


【解决方案1】:

我在下面发布了一些伪代码。你必须修改它以适应 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)

更新

刚刚注意到您希望它们按玩家评分平均分配。在这种情况下,只需确保在将他们放入团队之前按他们的评分对玩家进行排序(我将省略展示如何做到这一点,假设你知道如何在 Swift 中对数组进行排序,如果有帮助请评论需要。)

更新

我测试了我添加的代码并进行了一些修改,以便它在 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]

【讨论】:

  • //init the first dimension of empty arrays for each team 这是我的问题。我不确定如何初始化应该有teamAmount的团队(数组的第一维)我可能误解了它是如何工作的,我觉得它应该很简单
  • 应该很简单,只需teams.append([Player]())@ImmersionULTD(今晚稍后我会看看初始化数组的正确语法,但类似)
  • 感谢您的帮助。找到正确的语法后,我会尽快接受答案
  • 刚刚修复了语法,我运行了代码,只是将 Player 替换为 String 对象,因此我不必构建 Player 类,但它应该很容易换入。
  • 我自己解决了这个问题,昨晚修复了语法。不过感谢更新
【解决方案2】:

这里有一个适合你的选择:

// 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 { $0.rating > $1.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)]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 2012-02-18
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多