diff --git a/java-kanban.iml b/java-kanban.iml index d8a1435..e866a4a 100644 --- a/java-kanban.iml +++ b/java-kanban.iml @@ -33,5 +33,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/ru/yandex/javacource/golotin/schedule/Main.java b/src/ru/yandex/javacource/golotin/schedule/Main.java index 121c6e4..bf9e5d0 100644 --- a/src/ru/yandex/javacource/golotin/schedule/Main.java +++ b/src/ru/yandex/javacource/golotin/schedule/Main.java @@ -22,9 +22,9 @@ public static void main(String[] args) { taskManager.updateTask(new Task("Дом", Status.IN_PROGRESS, "Уборка в кухни и ванной")); - // taskManager.updateEpic(new Epic("Прогулка", Status.NEW, "Не пойду гулять")); - // taskManager.updateSubtask(new Subtask("Уборка", Status.IN_PROGRESS, "Убираюсь)")); - // taskManager.updateSubtask(new Subtask("Сделать кофе", Status.DONE, "Кофе приготовлено")); + taskManager.updateEpic(new Epic("Прогулка", Status.NEW, "Не пойду гулять")); + taskManager.updateSubtask(new Subtask("Уборка", Status.IN_PROGRESS, "Убираюсь)", 1)); + taskManager.updateSubtask(new Subtask("Сделать кофе", Status.DONE, "Кофе приготовлено", 1)); System.out.println(taskManager.getTasks()); diff --git a/src/ru/yandex/javacource/golotin/schedule/service/HistoryManager.java b/src/ru/yandex/javacource/golotin/schedule/service/HistoryManager.java index a87f042..3c98d5b 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/HistoryManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/HistoryManager.java @@ -7,7 +7,9 @@ public interface HistoryManager { void add(Task task); - List getHistory(); + List getAll(); + + void remove(int id); } \ No newline at end of file diff --git a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryHistoryManager.java b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryHistoryManager.java index a572828..701c08e 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryHistoryManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryHistoryManager.java @@ -1,28 +1,91 @@ package ru.yandex.javacource.golotin.schedule.service; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import ru.yandex.javacource.golotin.schedule.model.Task; -import ru.yandex.javacource.golotin.schedule.service.HistoryManager; public class InMemoryHistoryManager implements HistoryManager { - private static final int HISTOY_MAX_SIZE = 10; - private final List history = new ArrayList<>(); + + private static class Node { + Task item; + Node next; + Node prev; + + Node(Node prev, Task element, Node next) {// присвоение prev, element, next + this.item = element; + this.next = next; + this.prev = prev; + } + } + + private static final Map history = new HashMap<>(); + private Node first; + private Node last; @Override - public void add(Task task) { + public void add(Task task) {// добавление Task + if (task == null) { return; + }else { + remove(task.getId()); + linkLast(task); + history.put(task.getId(), last); + } - if (history.size() >= HISTOY_MAX_SIZE) { - history.remove(0); + } + + @Override + public List getAll() {// вывод списка истории + List list = new ArrayList<>(); + Node current = first; + while (current != null) { + + current = current.next; } - history.add(task); + return list; } + @Override - public List getHistory() { - return history; + public void remove(int id) {// удаление по id + final Node node = history.remove(id); + if (node == null) { + return; + } + removeNode(node); + } + + private void removeNode(Node node) { + + if (node.prev != null) { + node.prev.next = node.next; + if (node.next == null) { + last = node.prev; + } else { + node.next.prev = node.prev; + } + } else { + first = node.next; + if (first == null) { + last = null; + } else { + first.prev = null; + } + } + } + + private void linkLast(Task task) {// двигаем историю + final Node lastLink = last; + final Node newNode = new Node(lastLink, task, null); + last = newNode; + if (lastLink == null) { + first = newNode; + } else { + lastLink.next = newNode; + } } } \ No newline at end of file diff --git a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java index ca6141c..4d81f5f 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java @@ -12,16 +12,14 @@ public class InMemoryTaskManager implements TaskManager { - private int counterId = 0; - private final Map tasks = new HashMap<>(); - private final Map epics = new HashMap<>(); - private final Map subtasks = new HashMap<>(); - - private final HistoryManager historyManager = Manager.getDefaultHistory(); - + protected int counterId = 0; + final Map tasks = new HashMap<>(); + final Map epics = new HashMap<>(); + final Map subtasks = new HashMap<>(); + final HistoryManager historyManager = Manager.getDefaultHistory(); @Override - public Task createTask(Task task) { + public Task createTask(Task task) {// создание Task final int id = ++counterId; task.setId(id); tasks.put(id, task); @@ -29,7 +27,7 @@ public Task createTask(Task task) { } @Override - public Epic createEpic(Epic epic) { + public Epic createEpic(Epic epic) {// создание Epic final int id = ++counterId; epic.setId(id); epics.put(id, epic); @@ -38,7 +36,7 @@ public Epic createEpic(Epic epic) { @Override - public Subtask createSubtask(Subtask subtask) { + public Subtask createSubtask(Subtask subtask) {// создание Subtask final int epicId = subtask.getEpicId(); Epic epic = epics.get(epicId); if (epic == null) { @@ -53,7 +51,7 @@ public Subtask createSubtask(Subtask subtask) { } @Override - public void updateTask(Task task) { + public void updateTask(Task task) {// обновление Task final int id = task.getId(); final Task savedTask = tasks.get(id); if (savedTask == null) { @@ -63,7 +61,7 @@ public void updateTask(Task task) { } @Override - public void updateEpic(Epic epic) { + public void updateEpic(Epic epic) {// обновление Epic Epic savedEpic = epics.get(epic.getId()); if (savedEpic == null) { return; @@ -73,7 +71,7 @@ public void updateEpic(Epic epic) { } @Override - public void updateSubtask(Subtask subtask) { + public void updateSubtask(Subtask subtask) {// обновление Subtask final int id = subtask.getId(); final int epicId = subtask.getEpicId(); final Subtask savedSubtask = subtasks.get(id); @@ -85,15 +83,15 @@ public void updateSubtask(Subtask subtask) { return; } subtasks.put(id, subtask); - updateEpicStatus(epicId); + updateEpicStatus(epicId);// обновление статуса у Epic } @Override public void cleanTasks() { tasks.clear(); - } + }// очистка списка Tasks - public void cleanSubtasks() { + public void cleanSubtasks() {// очистка списка Subtasks for (Epic epic : epics.values()) { epic.cleanSubtask(); updateEpicStatus(epic.getId()); @@ -102,7 +100,7 @@ public void cleanSubtasks() { } @Override - public void cleanEpics() { + public void cleanEpics() {// очистка списка Epics и Subtasks epics.clear(); subtasks.clear(); @@ -111,10 +109,10 @@ public void cleanEpics() { @Override public void deleteTask(int id) { tasks.remove(id); - } + }// удаление по id Task @Override - public void deleteSubtask(int id) { + public void deleteSubtask(int id) {// удаление по id Subtask Subtask subtask = subtasks.remove(id); if (subtask == null) { return; @@ -125,7 +123,7 @@ public void deleteSubtask(int id) { } @Override - public void deleteEpic(int id) { + public void deleteEpic(int id) {// удаление по id Epic Epic epic = epics.remove(id); if (epic == null) { return; @@ -138,15 +136,15 @@ public void deleteEpic(int id) { @Override public ArrayList getTasks() { return new ArrayList<>(tasks.values()); - } + }// получаем список Tasks @Override public ArrayList getEpics() { return new ArrayList<>(epics.values()); - } + }// получаем список Epics @Override - public ArrayList getEpicSubtasks(int epicId) { + public ArrayList getEpicSubtasks(int epicId) {// получаем список Epic с Subtasks Epic epic = epics.get(epicId); ArrayList getSubtasks = null; for (Integer subtaskId : epic.getSubtaskIds()) { @@ -158,7 +156,7 @@ public ArrayList getEpicSubtasks(int epicId) { } @Override - public Task getTask(int id) { + public Task getTask(int id) {// получаем Task по id final Task task = tasks.get(id); historyManager.add(task); return task; @@ -166,25 +164,25 @@ public Task getTask(int id) { } @Override - public Epic getEpic(int id) { + public Epic getEpic(int id) {// получаем Epic по id final Epic epic = epics.get(id); historyManager.add(epic); return epic; } @Override - public Subtask getSubtask(int id) { + public Subtask getSubtask(int id) {// получаем Subtask по id final Subtask subtask = subtasks.get(id); historyManager.add(subtask); return subtask; } @Override - public List getHistory() { - return historyManager.getHistory(); + public List getHistory() {// получаем список истории + return historyManager.getAll(); } - private void updateEpicStatus(int epicId) { + private void updateEpicStatus(int epicId) {// обновление статуса Epic Epic epic = epics.get(epicId); ArrayList subtasks = new ArrayList<>(); for (Integer subtaskId : epic.getSubtaskIds()) {