1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sourceforge.jhunters.pool.data;
18
19 import java.security.SecureRandom;
20 import java.time.LocalDate;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.Map;
27
28
29
30
31 public class FixtureGenerator {
32
33
34
35 private final Map<Integer, Player> theMap;
36
37
38
39
40 private final List<Player> thePlayers;
41
42
43
44
45 private final SecureRandom theRandom;
46
47
48
49
50 private Integer theNumPlayers;
51
52
53
54
55 private boolean hasBye;
56
57
58
59
60 private Integer theMaxPlayer;
61
62
63
64
65 public FixtureGenerator() {
66
67 theMap = new HashMap<Integer, Player>();
68 thePlayers = new ArrayList<Player>();
69
70
71 theRandom = new SecureRandom();
72 theRandom.setSeed(System.nanoTime());
73 }
74
75
76
77
78
79 public void setPlayers(final PlayerList pPlayers) {
80
81 thePlayers.clear();
82
83
84 Iterator<Player> myIterator = pPlayers.playerIterator();
85 while (myIterator.hasNext()) {
86 Player myPlayer = myIterator.next();
87
88
89 if (myPlayer.isSelected()) {
90
91 thePlayers.add(myPlayer);
92 }
93 }
94
95
96 theNumPlayers = thePlayers.size();
97 hasBye = (theNumPlayers % 2) != 0;
98 theMaxPlayer = hasBye
99 ? theNumPlayers
100 : theNumPlayers - 1;
101 }
102
103
104
105
106 private void randomisePlayers() {
107
108 theMap.clear();
109
110
111 Collections.shuffle(thePlayers, theRandom);
112
113
114 int i = 1;
115 Iterator<Player> myIterator = thePlayers.iterator();
116 while (myIterator.hasNext()) {
117 Player myPlayer = myIterator.next();
118
119
120 theMap.put(i++, myPlayer);
121 }
122 }
123
124
125
126
127
128
129 public FixtureList createFixtures(final LocalDate pDate) {
130
131 FixtureList myFixtures = new FixtureList();
132
133
134 randomisePlayers();
135
136
137 for (int i = 1; i <= theMaxPlayer; i++) {
138
139 FixtureSet mySet = createFixtureSet(i);
140
141
142 myFixtures.addFixtureSet(mySet);
143 }
144
145
146 if (!hasBye) {
147
148 myFixtures.setByePlayer(theMap.get(theNumPlayers));
149 }
150
151
152 myFixtures.randomise(theRandom);
153
154
155 myFixtures.setDates(pDate);
156
157
158 return myFixtures;
159 }
160
161
162
163
164
165
166 private FixtureSet createFixtureSet(final Integer pBye) {
167
168 FixtureSet mySet = new FixtureSet();
169
170
171 int myNumFixtures = theMaxPlayer / 2;
172
173
174 int myHome = pBye + 1;
175 int myAway = pBye - 1;
176
177
178 for (int i = 0; i < myNumFixtures; i++) {
179
180 if (myHome > theMaxPlayer) {
181 myHome = 1;
182 }
183 if (myAway == 0) {
184 myAway = theMaxPlayer;
185 }
186
187
188 mySet.addFixture(theMap.get(myHome), theMap.get(myAway));
189
190
191 myHome++;
192 myAway--;
193 }
194
195
196 if ((pBye % 2) == 0) {
197 mySet.addFixture(theMap.get(pBye), null);
198 } else {
199 mySet.addFixture(null, theMap.get(pBye));
200 }
201
202
203 return mySet;
204 }
205 }