Matriz dentro de una matriz (matriz 2D?)

El título probablemente no está claro y no estoy seguro de cómo articular la idea sin detalles, así que aquí está el resumen:

Mi código tiene una variedad de Players (una class que escribí). Quiero dividir las inputs en la matriz de manera uniforme (en function de su Players.rating ) entre un número determinado de equipos. El problema surge de que el número de equipos es un var teamAmount y se puede establecer entre 2 y 8. Estoy tratando de encontrar una manera simple de crear una serie de matrices de class Player igual al valor de teamAmount (sin tener que escribir 7 cambiar casos). Estaba pensando en una matriz 2D, pero no puedo pensar cómo inicializarla. Siento que podría ser simple, pero no puedo resolverlo.

A continuación publiqué un pseudo-código. Deberás modificarlo para adaptarse a la syntax de Swift (de momento estoy lejos de una Mac y lo editaré cuando llegue a casa después de que lo lance a un parque infantil).

 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; } 

La idea básica es que sepas cuántos equipos quieres y puedes iniciar la primera dimensión de tu matriz 2D con un simple ciclo.

Luego, para ubicar a los jugadores en los equipos respectivos, solo usa el module mágico.

Teoría

  • Jugador 1% 4 Equipos = Pertenece al equipo 1.
  • Jugador 2% 4 Equipos = Pertenece al equipo 2
  • Jugador 3% 4 Equipos = Pertenece al equipo 3.
  • Jugador 4% 4 Equipos = Pertenece al equipo 0.
  • Jugador 5% 4 Equipos = Pertenece al equipo 1.
  • Jugador 6% 4 Equipos = Pertenece al equipo 2.
  • Jugador 7% 4 Equipos = Pertenece al equipo 3.
  • Jugador 8% 4 Equipos = Pertenece al equipo 0.

(Dado que 4% 4 es 0, tendrá que compensar su matriz o proporcionar alguna lógica simple para cubrir ese caso; lo más fácil sería tener un equipo 0 en lugar de un equipo 4)

Actualizar

Acabo de notar que desea que se distribuyan de manera uniforme por la sorting de los jugadores. En ese caso, solo asegúrate de orderar los jugadores por su sorting antes de colocarlos en equipos (omitiré mostrar cómo hacerlo bajo la suposition de que sabes cómo orderar una matriz en Swift, comentar si se necesita ayuda).

Actualizar

Probé el código que agregué e hice algunas modificaciones para que funcione correctamente en Swift

Aquí están los resultados como se esperaba

 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] 

aquí hay una opción para ti:

 // eg 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)] // eg setting up Team(s) let numberOfTeams = 3 typealias Team = [Player] // now do the work let teams = sortedPlayers.enumerate().networkinguce( 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)]]