@@ -70,10 +70,24 @@ public static void main(String[] args) throws IOException {
70
70
71
71
//////////////////////////////////////////////////////////////////////////////////////////////////
72
72
73
+ @ Override
74
+ protected void configure () throws IOException {
75
+
76
+ readProperties ();
77
+
78
+ configureHelpers ();
79
+ configureInputData ();
80
+ configureMassStarts ();
81
+ configurePairedLegs ();
82
+ configureIndividualLegStarts ();
83
+ }
84
+
73
85
public void processResults () throws IOException {
74
86
75
87
initialiseResults ();
76
88
89
+ interpolateMissingTimes ();
90
+ guessMissingBibNumbers ();
77
91
fillLegFinishTimes ();
78
92
fillDNFs ();
79
93
fillLegStartTimes ();
@@ -88,19 +102,6 @@ public void processResults() throws IOException {
88
102
printCollatedTimes ();
89
103
}
90
104
91
- @ Override
92
- protected void configure () throws IOException {
93
-
94
- readProperties ();
95
-
96
- configureHelpers ();
97
- configureInputData ();
98
- configureInterpolatedTimes ();
99
- configureMassStarts ();
100
- configurePairedLegs ();
101
- configureIndividualLegStarts ();
102
- }
103
-
104
105
protected void readProperties () {
105
106
106
107
super .readProperties ();
@@ -126,17 +127,27 @@ private void configureInputData() throws IOException {
126
127
127
128
entries = input .loadEntries ();
128
129
raw_results = input .loadRawResults ();
130
+
131
+ input .loadTimeAnnotations (raw_results );
129
132
}
130
133
131
- private void configureInterpolatedTimes () {
134
+ private void interpolateMissingTimes () {
132
135
133
136
int raw_result_index = 0 ;
134
137
int previous_non_null_time_index ;
135
138
136
139
while (raw_result_index < raw_results .length && raw_results [raw_result_index ].getRecordedFinishTime () == null ) raw_result_index ++;
137
140
138
- for (int i = 0 ; i < raw_result_index - 1 ; i ++)
141
+ for (int i = 0 ; i < raw_result_index ; i ++) {
139
142
raw_results [i ].setRecordedFinishTime (raw_results [raw_result_index ].getRecordedFinishTime ());
143
+ raw_results [i ].setInterpolatedTime (true );
144
+
145
+ final String existing_comment = raw_results [i ].getComment ();
146
+ String comment = "" ;
147
+ if (!existing_comment .isEmpty ()) comment = " " ;
148
+ comment += "Time not recorded. No basis for interpolation so set to first recorded time." ;
149
+ raw_results [i ].appendComment (comment );
150
+ }
140
151
141
152
while (raw_result_index < raw_results .length ) {
142
153
@@ -148,29 +159,121 @@ private void configureInterpolatedTimes() {
148
159
if (raw_result_index < raw_results .length ) {
149
160
final int number_of_consecutive_null_times = raw_result_index - previous_non_null_time_index - 1 ;
150
161
151
- System .out .println ("number_of_consecutive_null_times: " + number_of_consecutive_null_times );
152
162
Duration time_step = raw_results [raw_result_index ].getRecordedFinishTime ().
153
163
minus (raw_results [previous_non_null_time_index ].getRecordedFinishTime ()).
154
164
dividedBy (number_of_consecutive_null_times + 1 );
155
165
156
- System .out .println ("time before: " + raw_results [previous_non_null_time_index ].getRecordedFinishTime ());
157
- System .out .println ("time after: " + raw_results [raw_result_index ].getRecordedFinishTime ());
158
- System .out .println ("step: " + time_step );
159
-
160
-
161
166
for (int i = previous_non_null_time_index + 1 ; i < raw_result_index ; i ++) {
162
167
raw_results [i ].setRecordedFinishTime (raw_results [i - 1 ].getRecordedFinishTime ().plus (time_step ));
163
168
raw_results [i ].setInterpolatedTime (true );
169
+
170
+
171
+ final String existing_comment = raw_results [i ].getComment ();
172
+ String comment = "" ;
173
+ if (!existing_comment .isEmpty ()) comment = " " ;
174
+ comment += "Time not recorded. Time interpolated." ;
175
+ raw_results [i ].appendComment (comment );
164
176
}
165
177
}
166
178
else {
167
179
for (int i = previous_non_null_time_index + 1 ; i < raw_result_index ; i ++) {
168
- raw_results [i ].setRecordedFinishTime (Race .DUMMY_DURATION );
180
+ raw_results [i ].setRecordedFinishTime (raw_results [previous_non_null_time_index ].getRecordedFinishTime ());
181
+ raw_results [i ].setInterpolatedTime (true );
182
+
183
+
184
+ final String existing_comment = raw_results [i ].getComment ();
185
+ String comment = "" ;
186
+ if (!existing_comment .isEmpty ()) comment = " " ;
187
+ comment += "Time not recorded. No basis for interpolation so set to last recorded time." ;
188
+ raw_results [i ].appendComment (comment );
169
189
}
170
190
}
171
191
}
172
192
}
173
193
194
+ private void guessMissingBibNumbers () {
195
+
196
+ record TeamSummaryAtPosition (int team_number , int finishes_before , int finishes_after , Duration previous_finish , Duration next_finish ) { }
197
+
198
+ int position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber ();
199
+ while (position_of_first_missing_bib_number > 0 ) {
200
+
201
+ TeamSummaryAtPosition [] summaries = new TeamSummaryAtPosition [entries .length ];
202
+ for (int i = 0 ; i < summaries .length ; i ++) {
203
+
204
+ int bib_number = entries [i ].bib_number ;
205
+ int finishes_before = getNumberOfTeamFinishesBefore (position_of_first_missing_bib_number , bib_number );
206
+ int finishes_after = getNumberOfTeamFinishesAfter (position_of_first_missing_bib_number , bib_number );
207
+ Duration previous_finish_time = getPreviousTeamFinishTime (position_of_first_missing_bib_number , bib_number );
208
+ Duration next_finish_time = getNextTeamFinishTime (position_of_first_missing_bib_number , bib_number );
209
+ summaries [i ] = new TeamSummaryAtPosition (bib_number , finishes_before , finishes_after , previous_finish_time , next_finish_time );
210
+ }
211
+
212
+ Arrays .sort (summaries , Comparator .comparing (o -> o .previous_finish ));
213
+ Arrays .sort (summaries , Comparator .comparing (o -> o .next_finish ));
214
+ Arrays .sort (summaries , Comparator .comparingInt (o -> o .finishes_after ));
215
+ Arrays .sort (summaries , Comparator .comparingInt (o -> o .finishes_before ));
216
+
217
+ raw_results [position_of_first_missing_bib_number - 1 ].setBibNumber (summaries [0 ].team_number );
218
+ raw_results [position_of_first_missing_bib_number - 1 ].appendComment ("Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams." );
219
+
220
+ position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber ();
221
+ }
222
+
223
+ }
224
+
225
+ private int getNumberOfTeamFinishesBefore (int position , int bib_number ) {
226
+
227
+ int count = 0 ;
228
+ for (int i = position - 1 ; i > 0 ; i --) {
229
+ Integer bibNumber = raw_results [i - 1 ].getBibNumber ();
230
+ if (bibNumber != null && bibNumber == bib_number ) count ++;
231
+ }
232
+
233
+ return count ;
234
+ }
235
+
236
+ private int getNumberOfTeamFinishesAfter (int position , int bib_number ) {
237
+
238
+ int count = 0 ;
239
+ for (int i = position + 1 ; i <= raw_results .length ; i ++) {
240
+ Integer bibNumber = raw_results [i - 1 ].getBibNumber ();
241
+ if (bibNumber != null && bibNumber == bib_number ) count ++;
242
+ }
243
+
244
+ return count ;
245
+ }
246
+
247
+ private Duration getPreviousTeamFinishTime (int position , int bib_number ) {
248
+
249
+ for (int i = position - 1 ; i > 0 ; i --) {
250
+ Integer bibNumber = raw_results [i - 1 ].getBibNumber ();
251
+ if (bibNumber != null && raw_results [i - 1 ].getBibNumber () == bib_number ) return raw_results [i - 1 ].getRecordedFinishTime ();
252
+ }
253
+
254
+ return ZERO_TIME ;
255
+ }
256
+
257
+ private Duration getNextTeamFinishTime (int position , int bib_number ) {
258
+
259
+ for (int i = position + 1 ; i <= raw_results .length ; i ++) {
260
+ Integer bibNumber = raw_results [i - 1 ].getBibNumber ();
261
+ if (bibNumber != null && raw_results [i - 1 ].getBibNumber () == bib_number ) return raw_results [i - 1 ].getRecordedFinishTime ();
262
+ }
263
+
264
+ return ZERO_TIME ;
265
+ }
266
+
267
+
268
+ private int getPositionOfFirstMissingBibNumber () {
269
+
270
+ for (int i = 0 ; i < raw_results .length ; i ++) {
271
+ if (raw_results [i ].getBibNumber () == null ) return i + 1 ;
272
+ }
273
+
274
+ return 0 ;
275
+ }
276
+
174
277
private void configureMassStarts () {
175
278
176
279
start_times_for_mass_starts = new Duration [number_of_legs ];
@@ -289,17 +392,19 @@ private void fillLegFinishTimes() {
289
392
290
393
for (final RawResult raw_result : raw_results ) {
291
394
292
- final int team_index = findIndexOfTeamWithBibNumber (raw_result .getBibNumber ());
293
- final TeamResult result = overall_results [team_index ];
294
- final LegResult [] leg_results = result .leg_results ;
395
+ if (raw_result .getBibNumber () != null ) {
396
+ final int team_index = findIndexOfTeamWithBibNumber (raw_result .getBibNumber ());
397
+ final TeamResult result = overall_results [team_index ];
398
+ final LegResult [] leg_results = result .leg_results ;
295
399
296
- final int leg_index = findIndexOfNextUnfilledLegResult (leg_results );
400
+ final int leg_index = findIndexOfNextUnfilledLegResult (leg_results );
297
401
298
- leg_results [leg_index ].finish_time = raw_result .getRecordedFinishTime ().plus (start_offset );
402
+ leg_results [leg_index ].finish_time = raw_result .getRecordedFinishTime ().plus (start_offset );
299
403
300
- // Provisionally this leg is not DNF since a finish time was recorded.
301
- // However, it might still be set to DNF in fillDNFs() if the runner missed a checkpoint.
302
- leg_results [leg_index ].DNF = false ;
404
+ // Provisionally this leg is not DNF since a finish time was recorded.
405
+ // However, it might still be set to DNF in fillDNFs() if the runner missed a checkpoint.
406
+ leg_results [leg_index ].DNF = false ;
407
+ }
303
408
}
304
409
305
410
// if (leg_times_swap_string != null) swapLegTimes();
@@ -448,7 +553,7 @@ int getRecordedLegPosition(final int bib_number, final int leg_number) {
448
553
int legs_completed = 0 ;
449
554
450
555
for (int i = 0 ; i < raw_results .length ; i ++) {
451
- if (raw_results [i ].getBibNumber () == bib_number ) {
556
+ if (raw_results [i ].getBibNumber () != null && raw_results [ i ]. getBibNumber () == bib_number ) {
452
557
legs_completed ++;
453
558
if (legs_completed == leg_number ) return i + 1 ;
454
559
}
0 commit comments