Projekt

Obecné

Profil

Stáhnout (9.7 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
        //Re #7443
85
        return datePosition;
86
    }
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
        
306
        bitmap.fillWithZeros();
307
        
308
        bitmap.setSundaysAndHolidays(1);
309
        System.out.println(bitmap.toString());
310

    
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
        
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

    
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
}
(1-1/8)