У меня есть игроки. Игроки получили предпочтительную позицию. У нас есть 3 позиции - DEFENDERS, ATTACKERS, BOTH (игроки, которые хороши на обеих позициях). Мне нужно создать команды из двух человек. Сопряжение игроков должно быть таким: «Атакующий должен быть в паре с защитником или теми, кто может играть на обеих позициях. Конечно, те, кто чувствует себя комфортно на обеих позициях, могут играть друг с другом в команде. Два защитника или два атакующихболее слабые, чем другие комбинации, поэтому должны быть согласованы таким образом, только когда нет других вариантов. "
Я написал что-то подобное. Я знаю, что это наивная реализация, но не смог найти лучшего способа сделать это.
Сначала я сортирую игроков по их позициям, поэтому у меня есть 3 списка. Затем, используя цикл while, я имею дело с сначала атакующими, затем защитниками, затем атакующими / защитниками. Есть ли способ улучшить это? Если нет, я хотел бы знать, как я могу извлечь дублированный код в метод.
package foostour.app;
import foostour.app.model.Player;
import foostour.app.model.Team;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class TeamScheduler {
private List<Team> teams = new ArrayList<>();
private List<Player> defenders = new ArrayList<>();
private List<Player> attackers = new ArrayList<>();
private List<Player> attackersAndDefenders = new ArrayList<>();
private int teamNumber = 0;
List<Team> createTeams(List<Player> shuffledPlayers) {
sortPlayersByPosition(shuffledPlayers);
while (!attackers.isEmpty()) {
Team team = new Team("Team " + (teamNumber + 1));
team.setFirstPlayer(attackers.remove(new Random().nextInt(attackers.size())));
if (!defenders.isEmpty()) {
team.setSecondPlayer(defenders.remove(new Random().nextInt(defenders.size())));
} else if (!attackersAndDefenders.isEmpty()) {
team.setSecondPlayer(attackersAndDefenders.remove(new Random().nextInt(attackersAndDefenders.size())));
} else if (!attackers.isEmpty())
team.setSecondPlayer(attackers.remove(new Random().nextInt(attackers.size())));
teams.add(team);
teamNumber++;
}
while (!defenders.isEmpty()) {
Team team = new Team("Team " + (teamNumber + 1));
team.setFirstPlayer(defenders.remove(new Random().nextInt(defenders.size())));
if (!attackers.isEmpty()) {
team.setSecondPlayer(attackers.remove(new Random().nextInt(attackers.size())));
} else if (!attackersAndDefenders.isEmpty()) {
team.setSecondPlayer(attackersAndDefenders.remove(new Random().nextInt(attackersAndDefenders.size())));
} else if (!defenders.isEmpty())
team.setSecondPlayer(defenders.remove(new Random().nextInt(defenders.size())));
teams.add(team);
teamNumber++;
}
while (!attackersAndDefenders.isEmpty()) {
Team team = new Team("Team " + (teamNumber + 1));
team.setFirstPlayer(attackersAndDefenders.remove(new Random().nextInt(attackersAndDefenders.size())));
if (!attackers.isEmpty()) {
team.setSecondPlayer(attackers.remove(new Random().nextInt(attackers.size())));
} else if (!defenders.isEmpty()) {
team.setSecondPlayer(defenders.remove(new Random().nextInt(defenders.size())));
} else if (!attackersAndDefenders.isEmpty()) {
team.setSecondPlayer(attackersAndDefenders.remove(new Random().nextInt(attackersAndDefenders.size())));
}
teams.add(team);
teamNumber++;
}
return teams;
}
private void sortPlayersByPosition(List<Player> players) {
for (Player player : players) {
if (player.getPreferredPosition() == PositionType.BOTH)
attackersAndDefenders.add(player);
else if (player.getPreferredPosition() == PositionType.ATTACK)
attackers.add(player);
else if (player.getPreferredPosition() == PositionType.DEFENSE)
defenders.add(player);
}
}
}