Projekt

Obecné

Profil

Stáhnout (9.34 KB) Statistiky
| Větev: | Revize:
1
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
}
(1-1/8)