I wanted to create a simple method that creates two random teams for football/soccer match from a list of players with a requirement that the goalkeepers should be in different teams (so that one team should have at least one goalkeeper). It's a simple task and I wanted this method to be as clean as possible, let me know what do you think. cheers!
fun shuffleTeams() {
val availablePlayers = playersList.toMutableList()
val teamA = mutableListOf<Player>()
val teamB = mutableListOf<Player>()
val goalkeepers = availablePlayers.groupBy { player -> player.isGoalkeeper }.values.first { playersLists ->
playersLists.all { player -> player.isGoalkeeper }
}
if (goalkeepers.size >= 2) { availablePlayers.removeAll(goalkeepers.take(2)) }
availablePlayers.shuffle()
val teams = availablePlayers.chunked(if (availablePlayers.size % 2 == 0) (availablePlayers.size / 2) else (availablePlayers.size / 2) + 1)
if (goalkeepers.size >= 2) {
teamA.add(goalkeepers[0])
teamB.add(goalkeepers[1])
}
teamA.addAll(teams[0])
teamB.addAll(teams[1])
teamA.forEach { println("teamA - ${it.name}, ${it.isGoalkeeper}") }
teamB.forEach { println("teamB - ${it.name}, ${it.isGoalkeeper}") }
}
private val playersList = listOf(Player("A", true), Player("B"), Player("C"), Player("D"), Player("E"), Player("F"),
Player("G"), Player("H", true), Player("I", true), Player("J"), Player("K"), Player("L"), Player("M"))
data class Player(
val name: String,
val isGoalkeeper: Boolean = false
)