From 5a9b46b2981632166703002690ed0fe90944b574 Mon Sep 17 00:00:00 2001 From: Michel ten Voorde Date: Sun, 27 Oct 2024 17:15:14 +0100 Subject: [PATCH] Fix drawn players --- .../swiss/domain/entity/Tournament.java | 19 ++++--- .../swiss/service/TournamentPlayService.java | 54 +++---------------- 2 files changed, 18 insertions(+), 55 deletions(-) diff --git a/src/main/java/nl/connectedit/swiss/domain/entity/Tournament.java b/src/main/java/nl/connectedit/swiss/domain/entity/Tournament.java index f1b2942..60425f8 100644 --- a/src/main/java/nl/connectedit/swiss/domain/entity/Tournament.java +++ b/src/main/java/nl/connectedit/swiss/domain/entity/Tournament.java @@ -69,23 +69,26 @@ public class Tournament extends AbstractEntity { .collect(Collectors.toCollection(ArrayList::new)); } - public boolean hasPlayersDrawnOutMaxOnce() { - var drawnOutPlayers = new HashSet(); + public List getDrawnOutPlayers() { + var drawnOutPlayers = new ArrayList(); for (var event : events) { for (var group : event.getGroups()) { for (var round : group.getRounds()) { var drawnOut = round.getDrawnOut(); if (drawnOut != null) { - if (!drawnOutPlayers.add(drawnOut.getPlayer1())) { - return false; - } - if (drawnOut.getPlayer2() != null && !drawnOutPlayers.add(drawnOut.getPlayer2())) { - return false; + drawnOutPlayers.add(drawnOut.getPlayer1()); + if (drawnOut.getPlayer2() != null) { + drawnOutPlayers.add(drawnOut.getPlayer2()); } } } } } - return true; + return drawnOutPlayers; + } + + public boolean hasPlayersDrawnOutMaxOnce() { + var drawnOutPlayers = this.getDrawnOutPlayers(); + return drawnOutPlayers.size() == new HashSet<>(drawnOutPlayers).size(); } } diff --git a/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java b/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java index eb9e3a7..0a26f8e 100644 --- a/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java +++ b/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java @@ -61,15 +61,16 @@ public class TournamentPlayService { round.setStatus(Status.NOT_STARTED); if (remainingTeams.size() % 2 == 1) { - var random = new Random(); - var drawnOutPlayers = getDrawnOutPlayers(tournament); + var drawnOutPlayers = tournament.getDrawnOutPlayers(); + var tryPosition = remainingTeams.size() - 1; do { - var randomTeam = remainingTeams.get(random.nextInt(remainingTeams.size())); - if (!drawnOutPlayers.contains(randomTeam.getPlayer1()) && (randomTeam.getPlayer2() == null || !drawnOutPlayers.contains(randomTeam.getPlayer2()))) { - remainingTeams.remove(randomTeam); - round.setDrawnOut(randomTeam); + var tryDrawOutTeam = remainingTeams.get(tryPosition); + if (!drawnOutPlayers.contains(tryDrawOutTeam.getPlayer1()) && (tryDrawOutTeam.getPlayer2() == null || !drawnOutPlayers.contains(tryDrawOutTeam.getPlayer2()))) { + remainingTeams.remove(tryDrawOutTeam); + round.setDrawnOut(tryDrawOutTeam); break; } + tryPosition--; } while(true); } @@ -92,47 +93,6 @@ public class TournamentPlayService { return tournament; } - private List getDrawnOutPlayers(Tournament tournament) { - var players = new ArrayList(); - - for (var event : tournament.getEvents()) { - for (var group : event.getGroups()) { - var playersInGroup = group.getTeams().stream() - .map(this::getPlayersInTeam) - .flatMap(List::stream) - .toList(); - - for (var player : playersInGroup) { - for (var round : group.getRounds()) { - var foundInRound = false; - for (var match : round.getMatches()) { - if (playerIsInMatch(match, player)) { - foundInRound = true; - } - } - if (!foundInRound) { - players.add(player); - log.info(player.getFullName() + " is al uitgeloot in het toernooi."); - } - } - } - } - } - return players; - } - - private List getPlayersInTeam(Team team) { - return team.getPlayer2() == null ? List.of(team.getPlayer1()) : List.of(team.getPlayer1(), team.getPlayer2()); - } - - private boolean playerIsInTeam(Team team, Player player) { - return Objects.equals(team.getPlayer1(), player) || Objects.equals(team.getPlayer2(), player); - } - - private boolean playerIsInMatch(Match match, Player player) { - return playerIsInTeam(match.getTeam1(), player) || playerIsInTeam(match.getTeam2(), player); - } - private void printRound(Round round, List standings) { for (var match: round.getMatches()) { log.info("%s - %s".formatted(