Skip to content

Commit aebd1f1

Browse files
committed
Java sprint 8 v1.0
В классе Task и его наследниках были добавлены переменные startTime, duration, endTime. В классе FileBackedTaskManager добавлены поля для времени старта и продолжительности. 2 forEach переделаны под Stream API в классе InMemoryTaskManager
1 parent df2672e commit aebd1f1

File tree

6 files changed

+99
-41
lines changed

6 files changed

+99
-41
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ru/yandex/javacource/golotin/schedule/model/Epic.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package ru.yandex.javacource.golotin.schedule.model;
22

3+
import java.time.Duration;
4+
import java.time.Instant;
35
import java.util.ArrayList;
46
import java.util.List;
57

68
public class Epic extends Task {
79

810
private final List<Integer> subtaskIds = new ArrayList<>();
911

10-
public Epic(String name, Status status, String description) {
11-
super(name, status, description);
12+
public Epic(String name, Status status, String description, Instant startTime, int duration) {
13+
super(name, status, description, startTime, duration);
1214
}
1315

14-
public Epic(int id, String name, String description, Status status) {
15-
super(name, status, description);
16+
public Epic(int id, String name, String description, Status status, Instant startTime, int duration) {
17+
super(name, status, description,startTime, duration);
1618
setId(id);
1719
}
1820

@@ -36,6 +38,10 @@ public TaskType getType() {
3638
return TaskType.EPIC;
3739
}
3840

41+
public void setSumDurationSubtasks(Duration duration) {
42+
setDuration(getDuration().plus(duration).toMinutesPart());
43+
}
44+
3945
@Override
4046
public String toString() {
4147
return "Epic{" +

src/ru/yandex/javacource/golotin/schedule/model/Subtask.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package ru.yandex.javacource.golotin.schedule.model;
22

3+
import java.time.Instant;
4+
35
public class Subtask extends Task {
46

57
private Integer epicId;
68

7-
public Subtask(String name, Status status, String description, int epicId) {
9+
public Subtask(String name, Status status, String description, Instant startTime, int duration, int epicId) {
810

9-
super(name, status, description);
11+
super(name, status, description, startTime, duration);
1012
setEpicId(epicId);
1113
}
1214

13-
public Subtask(int id, String name, String description, Status status, Integer epicId) {
14-
super(name, status, description);
15+
public Subtask(int id, String name, String description, Status status, Instant startTime, int duration, Integer epicId) {
16+
super(name, status, description, startTime, duration);
1517
setId(id);
1618
setEpicId(epicId);
1719
}

src/ru/yandex/javacource/golotin/schedule/model/Task.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,37 @@
11
package ru.yandex.javacource.golotin.schedule.model;
22

3+
import java.time.Duration;
34
import java.util.Objects;
5+
import java.time.Instant;
6+
import java.time.temporal.ChronoUnit;
47

58
public class Task {
69
private int id;
710
private String name;
811
private String description;
912
private Status status;
1013

11-
public Task(String name, Status status, String description) {
14+
private Instant startTime; // LocalDateTime
15+
private Duration duration; // минуты или Duration
16+
private Instant endTime;
17+
18+
public Task(String name, Status status, String description, Instant startTime, int duration) {
1219
this.name = name;
1320
this.status = status;
1421
this.description = description;
22+
this.startTime = startTime;
23+
this.duration = Duration.ofMinutes(duration);
24+
this.endTime = startTime.plus(duration, ChronoUnit.MINUTES);
1525
}
1626

17-
public Task(int id, String name, String description, Status status) {
27+
public Task(int id, String name, String description, Status status,Instant startTime, int duration) {
1828
setId(id);
1929
this.name = name;
2030
this.status = status;
2131
this.description = description;
32+
this.startTime = startTime;
33+
this.duration = Duration.ofMinutes(duration);
34+
this.endTime = startTime.plus(duration, ChronoUnit.MINUTES);
2235
}
2336

2437
public int getId() {
@@ -61,6 +74,18 @@ public void setStatus(Status status) {
6174
this.status = status;
6275
}
6376

77+
public Instant getStartTime() {return startTime;}
78+
79+
public void setStartTime(Instant startTime) {this.startTime = startTime;}
80+
81+
public Duration getDuration() {return duration;}
82+
83+
public void setDuration(int duration) {this.duration = Duration.ofMinutes(duration);}
84+
85+
public Instant getEndTime() {return endTime;}
86+
87+
public void setEndTime(Instant endTime) {this.endTime = endTime;}
88+
6489
@Override
6590
public boolean equals(Object o) {
6691
if (this == o) return true;
@@ -83,4 +108,6 @@ public String toString() {
83108
", status=" + status +
84109
'}';
85110
}
111+
112+
86113
}

src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import java.nio.file.Files;
88

9+
import java.time.Duration;
10+
import java.time.Instant;
911
import java.util.Map;
1012

1113
import ru.yandex.javacource.golotin.schedule.exception.ManagerSaveException;
@@ -41,10 +43,10 @@ public static FileBackedTaskManager loadFromFile(File file) {
4143
taskManager.createTask(task);
4244
} else if (task.getType() == TaskType.SUBTASK) {
4345
taskManager.createSubtask(new Subtask(task.getId(), task.getName(), task.getDescription(),
44-
task.getStatus(), task.getEpicId()));
46+
task.getStatus(),task.getStartTime(),task.getDuration().toMinutesPart(), task.getEpicId()));
4547
} else if (task.getType() == TaskType.EPIC) {
4648
taskManager.createEpic(new Epic(task.getId(), task.getName(), task.getDescription(),
47-
task.getStatus()));
49+
task.getStatus(),task.getStartTime(),task.getDuration().toMinutesPart()));
4850
for (Subtask subtask : taskManager.subtasks.values()) {// Поиск подзадач эпика
4951
if (subtask.getEpicId() == task.getId()) {
5052
Epic epic = taskManager.epics.get(task.getId());
@@ -135,15 +137,17 @@ public static Task taskFromString(String value) {
135137
final String name = values[2];
136138
final Status status = Status.valueOf(values[3]);
137139
final String description = values[4];
140+
final Instant startTime = Instant.parse(values[5]);
141+
final Duration duration = Duration.parse(values[6]);
138142
if (type == TaskType.TASK) {
139-
return new Task(id, name, description, status);
143+
return new Task(id, name, description, status, startTime, duration.toMinutesPart());
140144
}
141145
if (type == TaskType.SUBTASK) {
142146
final int epicId = Integer.parseInt(values[5]);
143-
return new Subtask(id, name, description, status, epicId);
147+
return new Subtask(id, name, description, status, startTime, duration.toMinutesPart(), epicId);
144148
}
145149

146-
return new Epic(id, name, description, status);
150+
return new Epic(id, name, description, status, startTime, duration.toMinutesPart());
147151
}
148152

149153
protected void saveToFile() {

src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package ru.yandex.javacource.golotin.schedule.service;
22

3+
import ru.yandex.javacource.golotin.schedule.exception.ManagerSaveException;
34
import ru.yandex.javacource.golotin.schedule.exception.NotFoundException;
45
import ru.yandex.javacource.golotin.schedule.model.Epic;
56
import ru.yandex.javacource.golotin.schedule.model.Status;
67
import ru.yandex.javacource.golotin.schedule.model.Subtask;
78
import ru.yandex.javacource.golotin.schedule.model.Task;
89

9-
import java.util.ArrayList;
10-
import java.util.HashMap;
11-
import java.util.List;
12-
import java.util.Map;
10+
import java.util.*;
11+
import java.util.stream.Collectors;
1312

1413

1514
public class InMemoryTaskManager implements TaskManager {
@@ -18,7 +17,7 @@ public class InMemoryTaskManager implements TaskManager {
1817
protected final Map<Integer, Epic> epics;
1918
protected final Map<Integer, Subtask> subtasks;
2019
protected final HistoryManager historyManager;
21-
20+
protected final Set<Task> prioritizedTasks = new TreeSet<>(Comparator.comparing(Task::getStartTime));
2221

2322
public InMemoryTaskManager(HistoryManager historyManager) {
2423
this.historyManager = historyManager; // 3
@@ -31,6 +30,7 @@ public InMemoryTaskManager(HistoryManager historyManager) {
3130
public Task createTask(Task task) {// создание Task
3231
final int id = ++counterId;
3332
task.setId(id);
33+
addPriorityTask(task);
3434
tasks.put(id, task);
3535
return task;
3636
}
@@ -39,6 +39,7 @@ public Task createTask(Task task) {// создание Task
3939
public Epic createEpic(Epic epic) {// создание Epic
4040
final int id = ++counterId;
4141
epic.setId(id);
42+
addPriorityTask(epic);
4243
epics.put(id, epic);
4344
return epic;
4445
}
@@ -51,8 +52,10 @@ public Subtask createSubtask(Subtask subtask) {// создание Subtask
5152
if (epic == null) {
5253
return null;
5354
}
55+
epic.setSumDurationSubtasks(subtask.getDuration());
5456
final int id = ++counterId;
5557
subtask.setId(id);
58+
addPriorityTask(subtask);
5659
subtasks.put(id, subtask);
5760
epic.addSubtaskId(subtask.getId());
5861
updateEpicStatus(epicId);
@@ -61,37 +64,39 @@ public Subtask createSubtask(Subtask subtask) {// создание Subtask
6164

6265
@Override
6366
public void updateTask(Task task) {// обновление Task
64-
final int id = task.getId();
65-
final Task savedTask = tasks.get(id);
67+
final Task savedTask = tasks.get(task.getId());
6668
if (savedTask == null) {
6769
return;
6870
}
69-
tasks.put(id, task);
71+
addPriorityTask(task);
72+
tasks.put(task.getId(), task);
7073
}
7174

7275
@Override
7376
public void updateEpic(Epic epic) {// обновление Epic
74-
Epic savedEpic = epics.get(epic.getId());
77+
final Epic savedEpic = epics.get(epic.getId());
7578
if (savedEpic == null) {
7679
return;
7780
}
7881
savedEpic.setName(epic.getName());
7982
savedEpic.setDescription(epic.getDescription());
83+
addPriorityTask(savedEpic);
84+
epics.put(epic.getId(), epic);
8085
}
8186

8287
@Override
8388
public void updateSubtask(Subtask subtask) {// обновление Subtask
84-
final int id = subtask.getId();
8589
final int epicId = subtask.getEpicId();
86-
final Subtask savedSubtask = subtasks.get(id);
90+
final Subtask savedSubtask = subtasks.get(subtask.getId());
8791
if (savedSubtask == null) {
8892
return;
8993
}
9094
final Epic epic = epics.get(epicId);
9195
if (epic == null) {
9296
return;
9397
}
94-
subtasks.put(id, subtask);
98+
addPriorityTask(savedSubtask);
99+
subtasks.put(subtask.getId(), subtask);
95100
updateEpicStatus(epicId);// обновление статуса у Epic
96101
}
97102

@@ -155,13 +160,13 @@ public List<Epic> getEpics() {
155160
@Override
156161
public List<Subtask> getEpicSubtasks(int epicId) {// получаем список Epic с Subtasks
157162
Epic epic = epics.get(epicId);
158-
ArrayList<Subtask> getSubtasks = null;
159-
for (Integer subtaskId : epic.getSubtaskIds()) {
160-
if (this.subtasks.containsKey(subtaskId)) {
161-
getSubtasks.add(this.subtasks.get(subtaskId));
162-
}
163-
}
164-
return getSubtasks;
163+
// ArrayList<Subtask> getSubtasks = null;
164+
// for (Integer subtaskId : epic.getSubtaskIds()) {
165+
// if (this.subtasks.containsKey(subtaskId)) {
166+
// getSubtasks.add(this.subtasks.get(subtaskId));
167+
// }
168+
// }
169+
return epic.getSubtaskIds().stream().map(subtasks::get).collect(Collectors.toList());
165170
}
166171

167172
@Override
@@ -202,12 +207,15 @@ public List<Task> getHistory() {// получаем список истории
202207

203208
private void updateEpicStatus(int epicId) {// обновление статуса Epic
204209
Epic epic = epics.get(epicId);
205-
ArrayList<Subtask> subtasks = new ArrayList<>();
206-
for (Integer subtaskId : epic.getSubtaskIds()) {
207-
if (this.subtasks.containsKey(subtaskId)) {
208-
subtasks.add(this.subtasks.get(subtaskId));
209-
}
210-
}
210+
List<Subtask> subtasks = epic.getSubtaskIds().stream()
211+
.filter(this.subtasks::containsKey)
212+
.map(this.subtasks::get)
213+
.toList();
214+
// for (Integer subtaskId : epic.getSubtaskIds()) {
215+
// if (this.subtasks.containsKey(subtaskId)) {
216+
// subtasks.add(this.subtasks.get(subtaskId));
217+
// }
218+
// }
211219
for (Subtask statusSubtask : subtasks) {
212220
short subtaskNew = 0;
213221
short subtaskDone = 0;
@@ -232,4 +240,15 @@ private void updateEpicStatus(int epicId) {// обновление статус
232240
}
233241
}
234242

243+
private void addPriorityTask(Task task) {
244+
for(Task t : prioritizedTasks){
245+
if(t.getStartTime()==task.getStartTime()){
246+
throw new ManagerSaveException("Пересечение с задачей "+ task.toString());
247+
}
248+
}
249+
prioritizedTasks.add(task);
250+
}
251+
public List<Task> getPrioritizedTasks(){
252+
return new ArrayList<>(prioritizedTasks);
253+
}
235254
}

0 commit comments

Comments
 (0)