Projekt

Obecné

Profil

Stáhnout (9.7 KB) Statistiky
| Větev: | Revize:
1 cbd6adb3 Daniel Stuš
package data;
2
3
import java.time.LocalDate;
4
import java.time.ZoneId;
5
import java.time.temporal.ChronoUnit;
6
import java.util.Arrays;
7
import java.util.Calendar;
8
import java.util.Date;
9
10
//------ TO-DO LIST ----
11
// TODO: 04.05.2019 JavaDoc - Dokumentace
12
13
/**
14
 *
15
 * Trida uchovavajici informace a umoznujici praci s bitmapou
16
 *
17
 * @author  Daniel Stus, Marek Sobota, Lukas Scurko, Jan Jirman
18
 * @version 0.5
19
 *
20
 */
21
public class Bitmap {
22
23
    //-------------- Atributy --------------/
24
25
    /** Atribut -  Datum zacatku obdobi */
26
    private Calendar dateFrom;
27
28
    /** Atribut -  Datum konce obdobi */
29
    private Calendar dateTo;
30
31
    /** Atribut s cislem linky pro kterou je generovana bitmapa */
32
    private String lineNumber;
33
34
    /** Atribut s cislem spoje linky pro kterou je generovana bitmapa */
35
    private String connectionNumber;
36
37
    /** Pole uchovavajici bitmapu */
38
    private int[] bitmap;
39
40
    /** Atribut uchovavajici hodnotu dne (ktery den v tydnu odpovida) pocatku obdobi */
41
    private int firstDayOfWeek;
42
43
44
    //-------------- Konstruktor -------------/
45
46
    /**
47
     * Konstruktor incializuje a nastavuje důležité parametry tridy (@code Bitmap)
48
     *
49
     * @param dateFrom Datum zacatku obdobi
50
     * @param dateTo Datum konce obdobi
51
     * @param lineNumber Cislo linky
52
     * @param connectionNumber Cislo spoje dane linky
53
     */
54
    public Bitmap(Calendar dateFrom, Calendar dateTo, String lineNumber, String connectionNumber) {
55
        this.dateFrom = dateFrom;
56
        this.dateTo = dateTo;
57
        this.lineNumber = lineNumber;
58
        this.connectionNumber = connectionNumber;
59
        this.bitmap = new int[(int) getDateRange()];
60
        this.firstDayOfWeek = dateFrom.get(Calendar.DAY_OF_WEEK);
61
    }
62
63
64
    //----------------- Metody ----------------/
65
66
    /**
67
     * Metda vrací počet dní uživatelem zvoleného období
68
     *
69
     * @return Počet dní v uživatelem zvoleném období (rozmezí)
70
     */
71
    public long getDateRange() {
72
        LocalDate from = this.dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
73
        LocalDate to = this.dateTo.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
74
75
        long noOfDaysBetween = ChronoUnit.DAYS.between(from, to);
76
        return noOfDaysBetween+1;
77
    }
78
79
    public long getDatePosition(Calendar date) {
80
        LocalDate from = this.dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
81
        LocalDate to = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
82
83
        long datePosition = ChronoUnit.DAYS.between(from, to);
84 de8ed2a2 Jan Jirman
        //Re #7443
85
        return datePosition;
86 cbd6adb3 Daniel Stuš
    }
87
88
89
    public void setWorkdays(int value) {
90
        value = validateValue(value);
91
        int dayOfWeek = this.dateFrom.get(Calendar.DAY_OF_WEEK);
92
93
        for (int i = 0; i < this.bitmap.length; i++) {
94
            if (dayOfWeek != 7 && dayOfWeek != 1) {
95
                this.bitmap[i] = value;
96
            }
97
98
            dayOfWeek++;
99
            if (dayOfWeek == 8) dayOfWeek = 1;
100
        }
101
    }
102
103
    public void setSundaysAndHolidays(int value) {
104
        value = validateValue(value);
105
        int dayOfWeek = firstDayOfWeek;
106
107
        for (int i = 0; i < this.bitmap.length; i++) {
108
            if (dayOfWeek != 7) {
109
                this.bitmap[i] = value;
110
            }
111
112
            dayOfWeek++;
113
            if (dayOfWeek == 8) dayOfWeek = 1;
114
        }
115
    }
116
117
    public void setDay(Calendar day, int value) {
118
        value = validateValue(value);
119
        int dayPosition = (int) getDatePosition(day);
120
121
        bitmap[dayPosition] = value;
122
    }
123
124
125
    public void setOneDayOnly(Calendar day) {
126
        fillWithZeros();
127
        int dayPosition = (int) getDatePosition(day);
128
129
        bitmap[dayPosition] = 1;
130
    }
131
132
    public void setDaysInRange(Calendar from, Calendar to, int value) {
133
        value = validateValue(value);
134
        int dayPositionFrom = (int) getDatePosition(from);
135
        int dayPositionTo = (int) getDatePosition(to);
136
137
        for (int i = dayPositionFrom; i < dayPositionTo; i++) {
138
            bitmap[i] = value;
139
        }
140
141
    }
142
143
    public void setDaysInWeek(int dayNumber, int value) {
144
        value = validateValue(value);
145
        int dayOfWeek = firstDayOfWeek;
146
147
        for (int i = 0; i < this.bitmap.length; i++) {
148
            if (dayOfWeek == dayNumber) {
149
                this.bitmap[i] = value;
150
            }
151
152
            dayOfWeek++;
153
            if (dayOfWeek == 8) dayOfWeek = 1;
154
        }
155
    }
156
157
158
    // TODO: 04.05.2019 ?? Sude/Liche -- Platí pro víkendy ?? 
159
    public void setWeeks(int value, int remainder) {
160
        value = validateValue(value);
161
        int dayOfWeek =  this.dateFrom.get(Calendar.DAY_OF_WEEK);
162
        int weekNumber = this.dateFrom.get(Calendar.WEEK_OF_MONTH);
163
164
        for (int i = 0; i < this.bitmap.length; i++) {
165
            if ((weekNumber % 2)==remainder) {
166
                this.bitmap[i] = value;
167
            }
168
169
            dayOfWeek++;
170
            if (dayOfWeek == 8) dayOfWeek = 1;
171
            if (dayOfWeek == 2) weekNumber++;
172
173
        }
174
    }
175
176
177
    public void setWeeksRange(Calendar from, Calendar to, int value, int remainder) {
178
        value = validateValue(value);
179
        int dayOfWeek =  from.get(Calendar.DAY_OF_WEEK);
180
        int weekNumber = from.get(Calendar.WEEK_OF_MONTH);
181
        int dayPositionFrom = (int) getDatePosition(from);
182
        int dayPositionTo = (int) getDatePosition(to);
183
184
        for (int i = dayPositionFrom; i < dayPositionTo; i++) {
185
            if ((weekNumber % 2)==remainder) {
186
                this.bitmap[i] = value;
187
            }
188
189
            dayOfWeek++;
190
            if (dayOfWeek == 8) dayOfWeek = 1;
191
            if (dayOfWeek == 2) weekNumber++;
192
        }
193
194
    }
195
196
    // TODO: 04.05.2019 Kombinace (Sudé/Liché týdny + Časové kódy) 
197
198
    /**
199
     * Metoda naplní (přemaže) bitmapu nulami
200
     */
201
    public void fillWithZeros() {
202
        Arrays.fill(this.bitmap, 0);
203
    }
204
205
    /**
206
     * Metoda overuje spravnost zadane hodnoty
207
     * - do bitmapy lze zadat pouze 1 nebo 0
208
     * - v pripade ze uzivatel zada cislo vetsi nez jedna metoda vrati jednotku
209
     * - v pripade ze uzivatel zada cislo mensi nez nula metoda vrati nulu
210
     *
211
     * @param value Uzivatelem zadana hodnota
212
     * @return Nova (spravna hodnota) ukladajici se do bitmapy
213
     */
214
    public static int validateValue(int value) {
215
        if (value < 0) value = 0;
216
        else if (value > 0) value = 1;
217
        else return value;
218
        return value;
219
    }
220
221
    public Calendar getDateFrom() {
222
        return dateFrom;
223
    }
224
225
    public void setDateFrom(Calendar dateFrom) {
226
        this.dateFrom = dateFrom;
227
    }
228
229
    public Calendar getDateTo() {
230
        return dateTo;
231
    }
232
233
    public void setDateTo(Calendar dateTo) {
234
        this.dateTo = dateTo;
235
    }
236
237
    public String getLineNumber() {
238
        return lineNumber;
239
    }
240
241
    public void setLineNumber(String lineNumber) {
242
        this.lineNumber = lineNumber;
243
    }
244
245
    public String getConnectionNumber() {
246
        return connectionNumber;
247
    }
248
249
    public void setConnectionNumber(String connectionNumber) {
250
        this.connectionNumber = connectionNumber;
251
    }
252
253
    public int[] getBitmap() {
254
        return bitmap;
255
    }
256
257
    public void setBitmap(int[] bitmap) {
258
        this.bitmap = bitmap;
259
    }
260
261
    public int getFirstDayOfWeek() {
262
        return firstDayOfWeek;
263
    }
264
265
    public void setFirstDayOfWeek(int firstDayOfWeek) {
266
        this.firstDayOfWeek = firstDayOfWeek;
267
    }
268
269
    @Override
270
    public String toString() {
271
        return Arrays.toString(this.bitmap);
272
    }
273
274
275
    /**
276
     *
277
     * hlavni metoda pro ozkouseni funkcnosti {@code Bitmap}
278
     *-issue #7374
279
     *
280
     * @param args parametry programu
281
     */
282
    public static void main(String[] args) {
283
284
        Calendar dateFrom = Calendar.getInstance();
285
        Calendar dateTo = Calendar.getInstance();
286
        dateFrom.setTime(new Date(2019-1900, 4, 1)); // -- Jen pro testování Deprecated --
287
        dateTo.setTime(new Date(2019-1900, 4, 31)); // rok udáván od 1900, měsíc se počítá od 0
288
289
290
        Bitmap bitmap = new Bitmap(dateFrom, dateTo, "143440", "1");
291
292
293
        // ------------- KONTROLNÍ VÝPISY -----------------
294
        System.out.println("------------- KONTROLNÍ VÝPISY -----------------");
295
        System.out.println("Linka: "+ bitmap.getLineNumber()+" - Spoj:"+bitmap.getConnectionNumber());
296
        System.out.println("Datum: od: " + bitmap.getDateFrom().getTime() + " | do: " + bitmap.getDateTo().getTime());
297
        System.out.println("První den je: "+bitmap.getFirstDayOfWeek() + " (1 - Neděle; 2 - Pondělí; 3 - Úterý; 4 - Středa; 5 - Čtvrtek; 6 - Pátek; 7 - Sobota)");
298
        System.out.println("Počet dní v rozmezí: " + bitmap.getDateRange());
299
        System.out.println(bitmap.toString());
300
301
        //Jede pouze v pracovní dny
302
        bitmap.setWorkdays(1);
303
        System.out.println("\nJede v pracovní dny:");
304
        System.out.println(bitmap.toString());
305 de8ed2a2 Jan Jirman
        
306
        bitmap.fillWithZeros();
307
        
308
        bitmap.setSundaysAndHolidays(1);
309
        System.out.println(bitmap.toString());
310 cbd6adb3 Daniel Stuš
311
        // Kontrola přemazání
312
        System.out.println("\nKontrola přemazání:");
313
        bitmap.fillWithZeros();
314
        System.out.println(bitmap.toString());
315
316
        //Nastavit pouze Pondělky - atribut 2
317
        System.out.println("\nJede každé pondělí:");
318
        bitmap.setDaysInWeek(2, 1);
319
        System.out.println(bitmap.toString());
320
321
        //přemazání
322
        bitmap.fillWithZeros();
323 de8ed2a2 Jan Jirman
        
324
        Calendar dateTo2 = Calendar.getInstance();
325
        dateTo2.setTime(new Date(2019-1900, 4, 13));
326
        bitmap.setWeeksRange(dateFrom, dateTo2, 1, 1);
327
        System.out.println(bitmap.toString());
328 cbd6adb3 Daniel Stuš
329
        //Nastavit liché týdny (zbytek(remainder) 1 - liché)
330
        System.out.println("\nLiché týdny:");
331
        bitmap.setWeeks(1, 1);
332
        System.out.println(bitmap.toString());
333
334
335
336
337
    }
338
339
340
}