Projekt

Obecné

Profil

Stáhnout (9.34 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
        return datePosition+1;
85
    }
86
87
88
    public void setWorkdays(int value) {
89
        value = validateValue(value);
90
        int dayOfWeek = this.dateFrom.get(Calendar.DAY_OF_WEEK);
91
92
        for (int i = 0; i < this.bitmap.length; i++) {
93
            if (dayOfWeek != 7 && dayOfWeek != 1) {
94
                this.bitmap[i] = value;
95
            }
96
97
            dayOfWeek++;
98
            if (dayOfWeek == 8) dayOfWeek = 1;
99
        }
100
    }
101
102
    public void setSundaysAndHolidays(int value) {
103
        value = validateValue(value);
104
        int dayOfWeek = firstDayOfWeek;
105
106
        for (int i = 0; i < this.bitmap.length; i++) {
107
            if (dayOfWeek != 7) {
108
                this.bitmap[i] = value;
109
            }
110
111
            dayOfWeek++;
112
            if (dayOfWeek == 8) dayOfWeek = 1;
113
        }
114
    }
115
116
    public void setDay(Calendar day, int value) {
117
        value = validateValue(value);
118
        int dayPosition = (int) getDatePosition(day);
119
120
        bitmap[dayPosition] = value;
121
    }
122
123
124
    public void setOneDayOnly(Calendar day) {
125
        fillWithZeros();
126
        int dayPosition = (int) getDatePosition(day);
127
128
        bitmap[dayPosition] = 1;
129
    }
130
131
    public void setDaysInRange(Calendar from, Calendar to, int value) {
132
        value = validateValue(value);
133
        int dayPositionFrom = (int) getDatePosition(from);
134
        int dayPositionTo = (int) getDatePosition(to);
135
136
        for (int i = dayPositionFrom; i < dayPositionTo; i++) {
137
            bitmap[i] = value;
138
        }
139
140
    }
141
142
    public void setDaysInWeek(int dayNumber, int value) {
143
        value = validateValue(value);
144
        int dayOfWeek = firstDayOfWeek;
145
146
        for (int i = 0; i < this.bitmap.length; i++) {
147
            if (dayOfWeek == dayNumber) {
148
                this.bitmap[i] = value;
149
            }
150
151
            dayOfWeek++;
152
            if (dayOfWeek == 8) dayOfWeek = 1;
153
        }
154
    }
155
156
157
    // TODO: 04.05.2019 ?? Sude/Liche -- Platí pro víkendy ?? 
158
    public void setWeeks(int value, int remainder) {
159
        value = validateValue(value);
160
        int dayOfWeek =  this.dateFrom.get(Calendar.DAY_OF_WEEK);
161
        int weekNumber = this.dateFrom.get(Calendar.WEEK_OF_MONTH);
162
163
        for (int i = 0; i < this.bitmap.length; i++) {
164
            if ((weekNumber % 2)==remainder) {
165
                this.bitmap[i] = value;
166
            }
167
168
            dayOfWeek++;
169
            if (dayOfWeek == 8) dayOfWeek = 1;
170
            if (dayOfWeek == 2) weekNumber++;
171
172
        }
173
    }
174
175
176
    public void setWeeksRange(Calendar from, Calendar to, int value, int remainder) {
177
        value = validateValue(value);
178
        int dayOfWeek =  from.get(Calendar.DAY_OF_WEEK);
179
        int weekNumber = from.get(Calendar.WEEK_OF_MONTH);
180
        int dayPositionFrom = (int) getDatePosition(from);
181
        int dayPositionTo = (int) getDatePosition(to);
182
183
        for (int i = dayPositionFrom; i < dayPositionTo; i++) {
184
            if ((weekNumber % 2)==remainder) {
185
                this.bitmap[i] = value;
186
            }
187
188
            dayOfWeek++;
189
            if (dayOfWeek == 8) dayOfWeek = 1;
190
            if (dayOfWeek == 2) weekNumber++;
191
        }
192
193
    }
194
195
    // TODO: 04.05.2019 Kombinace (Sudé/Liché týdny + Časové kódy) 
196
197
    /**
198
     * Metoda naplní (přemaže) bitmapu nulami
199
     */
200
    public void fillWithZeros() {
201
        Arrays.fill(this.bitmap, 0);
202
    }
203
204
    /**
205
     * Metoda overuje spravnost zadane hodnoty
206
     * - do bitmapy lze zadat pouze 1 nebo 0
207
     * - v pripade ze uzivatel zada cislo vetsi nez jedna metoda vrati jednotku
208
     * - v pripade ze uzivatel zada cislo mensi nez nula metoda vrati nulu
209
     *
210
     * @param value Uzivatelem zadana hodnota
211
     * @return Nova (spravna hodnota) ukladajici se do bitmapy
212
     */
213
    public static int validateValue(int value) {
214
        if (value < 0) value = 0;
215
        else if (value > 0) value = 1;
216
        else return value;
217
        return value;
218
    }
219
220
    public Calendar getDateFrom() {
221
        return dateFrom;
222
    }
223
224
    public void setDateFrom(Calendar dateFrom) {
225
        this.dateFrom = dateFrom;
226
    }
227
228
    public Calendar getDateTo() {
229
        return dateTo;
230
    }
231
232
    public void setDateTo(Calendar dateTo) {
233
        this.dateTo = dateTo;
234
    }
235
236
    public String getLineNumber() {
237
        return lineNumber;
238
    }
239
240
    public void setLineNumber(String lineNumber) {
241
        this.lineNumber = lineNumber;
242
    }
243
244
    public String getConnectionNumber() {
245
        return connectionNumber;
246
    }
247
248
    public void setConnectionNumber(String connectionNumber) {
249
        this.connectionNumber = connectionNumber;
250
    }
251
252
    public int[] getBitmap() {
253
        return bitmap;
254
    }
255
256
    public void setBitmap(int[] bitmap) {
257
        this.bitmap = bitmap;
258
    }
259
260
    public int getFirstDayOfWeek() {
261
        return firstDayOfWeek;
262
    }
263
264
    public void setFirstDayOfWeek(int firstDayOfWeek) {
265
        this.firstDayOfWeek = firstDayOfWeek;
266
    }
267
268
    @Override
269
    public String toString() {
270
        return Arrays.toString(this.bitmap);
271
    }
272
273
274
    /**
275
     *
276
     * hlavni metoda pro ozkouseni funkcnosti {@code Bitmap}
277
     *-issue #7374
278
     *
279
     * @param args parametry programu
280
     */
281
    public static void main(String[] args) {
282
283
        Calendar dateFrom = Calendar.getInstance();
284
        Calendar dateTo = Calendar.getInstance();
285
        dateFrom.setTime(new Date(2019-1900, 4, 1)); // -- Jen pro testování Deprecated --
286
        dateTo.setTime(new Date(2019-1900, 4, 31)); // rok udáván od 1900, měsíc se počítá od 0
287
288
289
        Bitmap bitmap = new Bitmap(dateFrom, dateTo, "143440", "1");
290
291
292
        // ------------- KONTROLNÍ VÝPISY -----------------
293
        System.out.println("------------- KONTROLNÍ VÝPISY -----------------");
294
        System.out.println("Linka: "+ bitmap.getLineNumber()+" - Spoj:"+bitmap.getConnectionNumber());
295
        System.out.println("Datum: od: " + bitmap.getDateFrom().getTime() + " | do: " + bitmap.getDateTo().getTime());
296
        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)");
297
        System.out.println("Počet dní v rozmezí: " + bitmap.getDateRange());
298
        System.out.println(bitmap.toString());
299
300
        //Jede pouze v pracovní dny
301
        bitmap.setWorkdays(1);
302
        System.out.println("\nJede v pracovní dny:");
303
        System.out.println(bitmap.toString());
304
305
        // Kontrola přemazání
306
        System.out.println("\nKontrola přemazání:");
307
        bitmap.fillWithZeros();
308
        System.out.println(bitmap.toString());
309
310
        //Nastavit pouze Pondělky - atribut 2
311
        System.out.println("\nJede každé pondělí:");
312
        bitmap.setDaysInWeek(2, 1);
313
        System.out.println(bitmap.toString());
314
315
        //přemazání
316
        bitmap.fillWithZeros();
317
318
        //Nastavit liché týdny (zbytek(remainder) 1 - liché)
319
        System.out.println("\nLiché týdny:");
320
        bitmap.setWeeks(1, 1);
321
        System.out.println(bitmap.toString());
322
323
324
325
326
    }
327
328
329
}