From bc885af9ab1c749b6201427376597b6ea8112118 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Tue, 12 Aug 2025 18:02:47 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B4=20?= =?UTF-8?q?6=20=D1=84=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/HistoryManager.java | 1 + src/managers/InMemoryHistoryManager.java | 40 +++++++++++++++++++----- src/managers/InMemoryTaskManager.java | 5 ++- src/tasks/Node.java | 13 ++++++++ 4 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 src/tasks/Node.java diff --git a/src/managers/HistoryManager.java b/src/managers/HistoryManager.java index 91f00a1..c926987 100644 --- a/src/managers/HistoryManager.java +++ b/src/managers/HistoryManager.java @@ -6,6 +6,7 @@ public interface HistoryManager { void add(Task task); + void remove(int id); List getHistory(); } \ No newline at end of file diff --git a/src/managers/InMemoryHistoryManager.java b/src/managers/InMemoryHistoryManager.java index 7b339bb..f5f8621 100644 --- a/src/managers/InMemoryHistoryManager.java +++ b/src/managers/InMemoryHistoryManager.java @@ -1,30 +1,56 @@ package managers; +import tasks.Node; import tasks.Task; + +import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; public class InMemoryHistoryManager implements HistoryManager { - private LinkedList history = new LinkedList<>(); + private HashMap testHistory = new HashMap<>(); - public static final int MAX_HISTORY_COUNT = 10; + private Node head; + private Node tail; + private int size = 0; @Override public void add(Task task) { if (task == null) { return; } - history.add(new Task(task)); - if (history.size() > MAX_HISTORY_COUNT) { - history.removeFirst(); + linkLast(task); + if (testHistory.containsKey(task.getId())) { + } + } @Override public List getHistory() { - LinkedList copyHistory = new LinkedList<>(); - copyHistory.addAll(history); + ArrayList historyList = new ArrayList<>(testHistory) return copyHistory; } + + @Override + public void remove(int id) { + testHistory.remove(id); + } + + public void linkLast(Task task) { + final Node oldTail = tail; + final Node newNode = new Node<>(oldTail, task, null); + tail = newNode; + if (oldTail == null) + head = newNode; + else + oldTail.next = newNode; + size++; + } + + public void removeNode(Node node) { + + } } diff --git a/src/managers/InMemoryTaskManager.java b/src/managers/InMemoryTaskManager.java index a624a29..0347c8a 100644 --- a/src/managers/InMemoryTaskManager.java +++ b/src/managers/InMemoryTaskManager.java @@ -75,6 +75,7 @@ public void deleteEpicSubtask(Epic epic) { @Override public void removeTaskForId(Integer id) { taskList.remove(id); + historyManager.remove(id); } @Override @@ -85,13 +86,15 @@ public void removeEpicForId(Integer id) { subtaskList.remove(subtask.getId()); } } + historyManager.remove(id); } @Override public void removeSubtaskForId(Integer id) { int epicId = subtaskList.get(id).getEpicId(); subtaskList.remove(id); - checkStatus(epicList.get(epicId)); //проверяем статус эпика из которого удалили подзадачу + checkStatus(epicList.get(epicId));//проверяем статус эпика из которого удалили подзадачу + historyManager.remove(id); } @Override diff --git a/src/tasks/Node.java b/src/tasks/Node.java new file mode 100644 index 0000000..cd1e990 --- /dev/null +++ b/src/tasks/Node.java @@ -0,0 +1,13 @@ +package tasks; + +public class Node { + public Task task; + public Node next; + public Node prev; + + public Node(Node prev, Task task, Node next) { + this.task = task; + this.next = null; + this.prev = null; + } +} From a4687b46d6e3b4523417756fa558ef1b89f99ffa Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Tue, 12 Aug 2025 22:55:50 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B2=D0=BE=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/InMemoryHistoryManager.java | 55 ++++++++++++++++-------- src/tasks/Node.java | 17 ++++++-- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/managers/InMemoryHistoryManager.java b/src/managers/InMemoryHistoryManager.java index f5f8621..d55e9bf 100644 --- a/src/managers/InMemoryHistoryManager.java +++ b/src/managers/InMemoryHistoryManager.java @@ -10,47 +10,64 @@ public class InMemoryHistoryManager implements HistoryManager { - private HashMap testHistory = new HashMap<>(); - - private Node head; - private Node tail; - private int size = 0; + private HashMap mapHistory = new HashMap<>(); + private Node head; + private Node tail; @Override public void add(Task task) { if (task == null) { return; } + final int id = task.getId(); + removeNode(id); linkLast(task); - if (testHistory.containsKey(task.getId())) { + mapHistory.put(id, head); + } + private ArrayList getTasks() { + ArrayList historyList = new ArrayList<>(); + for (Integer id : mapHistory.keySet()) { + historyList.add(mapHistory.get(id).task); } - + return historyList; } @Override public List getHistory() { - ArrayList historyList = new ArrayList<>(testHistory) - return copyHistory; - } - - @Override - public void remove(int id) { - testHistory.remove(id); + return getTasks(); } - public void linkLast(Task task) { - final Node oldTail = tail; - final Node newNode = new Node<>(oldTail, task, null); + private void linkLast(Task task) { + final Node oldTail = tail; + final Node newNode = new Node(oldTail, task, null); tail = newNode; if (oldTail == null) head = newNode; else oldTail.next = newNode; - size++; } - public void removeNode(Node node) { + private void removeNode(int id) { + Node node = mapHistory.remove(id); + if (tail == head) { + tail.prev = null; + head.next = null; + } + if (node == tail) { + tail = node.next; + tail.prev = null; + } else if (node == head) { + head = node.prev; + head.next = null; + } else { + node.prev.next = node.next; + node.next.prev = node.prev; + } + } + @Override + public void remove(int id) { + removeNode(id); } } diff --git a/src/tasks/Node.java b/src/tasks/Node.java index cd1e990..29e629d 100644 --- a/src/tasks/Node.java +++ b/src/tasks/Node.java @@ -1,13 +1,22 @@ package tasks; -public class Node { +public class Node { public Task task; - public Node next; - public Node prev; + public Node next; + public Node prev; - public Node(Node prev, Task task, Node next) { + public Node(Node prev, Task task, Node next) { this.task = task; this.next = null; this.prev = null; } + + @Override + public String toString() { + return "Node{" + + "task=" + task + + ", next=" + next + (next == null ? null : next.task) + + ", prev=" + prev + (prev == null ? null : prev.task) + + '}'; + } } From acbab39a82d085575de3254142dd930af92657a0 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Wed, 13 Aug 2025 13:46:21 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B2=D0=BE=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/InMemoryHistoryManager.java | 65 +++++++++++++++--------- src/tasks/Node.java | 22 -------- 2 files changed, 41 insertions(+), 46 deletions(-) delete mode 100644 src/tasks/Node.java diff --git a/src/managers/InMemoryHistoryManager.java b/src/managers/InMemoryHistoryManager.java index d55e9bf..3b57fca 100644 --- a/src/managers/InMemoryHistoryManager.java +++ b/src/managers/InMemoryHistoryManager.java @@ -1,16 +1,34 @@ package managers; -import tasks.Node; import tasks.Task; - import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; public class InMemoryHistoryManager implements HistoryManager { - private HashMap mapHistory = new HashMap<>(); + private static class Node { + public Task task; + public Node next; + public Node prev; + + public Node(Node prev, Task task, Node next) { + this.task = task; + this.next = next; + this.prev = prev; + } + + @Override + public String toString() { + return "Node{" + + "task=" + task + + ", next=" + next + (next == null ? null : next.task) + + ", prev=" + prev + (prev == null ? null : prev.task) + + '}'; + } + } + + private final HashMap mapHistory = new HashMap<>(); private Node head; private Node tail; @@ -38,31 +56,30 @@ public List getHistory() { return getTasks(); } - private void linkLast(Task task) { - final Node oldTail = tail; - final Node newNode = new Node(oldTail, task, null); - tail = newNode; - if (oldTail == null) - head = newNode; - else - oldTail.next = newNode; + private void linkLast(Task task) { + head = new Node(tail, task, head); } private void removeNode(int id) { - Node node = mapHistory.remove(id); - if (tail == head) { - tail.prev = null; - head.next = null; + final Node node = mapHistory.remove(id); + if (node == null) { + return; } - if (node == tail) { - tail = node.next; - tail.prev = null; - } else if (node == head) { - head = node.prev; - head.next = null; - } else { + if (node.prev != null) { node.prev.next = node.next; - node.next.prev = node.prev; + if (node.next == null) { + head = node.prev; + head.next = null; + } else { + node.next.prev = node.prev; + } + } else { + tail = node.next; + if (tail == null) { + head = null; + } else { + tail.prev = null; + } } } diff --git a/src/tasks/Node.java b/src/tasks/Node.java deleted file mode 100644 index 29e629d..0000000 --- a/src/tasks/Node.java +++ /dev/null @@ -1,22 +0,0 @@ -package tasks; - -public class Node { - public Task task; - public Node next; - public Node prev; - - public Node(Node prev, Task task, Node next) { - this.task = task; - this.next = null; - this.prev = null; - } - - @Override - public String toString() { - return "Node{" + - "task=" + task + - ", next=" + next + (next == null ? null : next.task) + - ", prev=" + prev + (prev == null ? null : prev.task) + - '}'; - } -} From 75c4d40c0adcac5d94377b018328d35b47a5070d Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 14 Aug 2025 14:50:35 +0300 Subject: [PATCH 4/7] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B2=D0=BE=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B2=20?= =?UTF-8?q?main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 21 ++++++++++ src/managers/HistoryManager.java | 1 + src/managers/InMemoryHistoryManager.java | 52 +++++++++++++++--------- src/managers/InMemoryTaskManager.java | 9 ++++ 4 files changed, 64 insertions(+), 19 deletions(-) diff --git a/src/Main.java b/src/Main.java index 6414bc2..a69d0ed 100644 --- a/src/Main.java +++ b/src/Main.java @@ -88,5 +88,26 @@ public static void main(String[] args) { System.out.println(inMemoryTaskManager.getAllSubtask()); System.out.println(inMemoryTaskManager.getEpicList()); System.out.println(inMemoryTaskManager.getTaskList()); + //спринт6 + inMemoryTaskManager.deleteHistory(); + Task task10 = new Task("1", "тело1", TaskStatus.NEW); + Task task20 = new Task("2", "тело2", TaskStatus.IN_PROGRESS); + inMemoryTaskManager.addTask(task10); + inMemoryTaskManager.addTask(task20); + inMemoryTaskManager.getTaskForId(task10.getId()); + System.out.println("первый таск в истории"); + System.out.println(inMemoryTaskManager.getHistory()); + System.out.println(); + inMemoryTaskManager.getTaskForId(task20.getId()); + System.out.println("добавили второй"); + System.out.println(inMemoryTaskManager.getHistory()); + System.out.println(); + inMemoryTaskManager.getTaskForId(task10.getId()); + System.out.println("обратились к первому должен появится в конце и пропасть в начале"); + System.out.println(inMemoryTaskManager.getHistory()); + + + + } } diff --git a/src/managers/HistoryManager.java b/src/managers/HistoryManager.java index c926987..aae0eb9 100644 --- a/src/managers/HistoryManager.java +++ b/src/managers/HistoryManager.java @@ -7,6 +7,7 @@ public interface HistoryManager { void add(Task task); void remove(int id); + void deleteHistory(); List getHistory(); } \ No newline at end of file diff --git a/src/managers/InMemoryHistoryManager.java b/src/managers/InMemoryHistoryManager.java index 3b57fca..36ff1fb 100644 --- a/src/managers/InMemoryHistoryManager.java +++ b/src/managers/InMemoryHistoryManager.java @@ -6,7 +6,6 @@ import java.util.List; public class InMemoryHistoryManager implements HistoryManager { - private static class Node { public Task task; public Node next; @@ -39,14 +38,15 @@ public void add(Task task) { } final int id = task.getId(); removeNode(id); - linkLast(task); - mapHistory.put(id, head); + mapHistory.put(id, linkLast(task)); } private ArrayList getTasks() { ArrayList historyList = new ArrayList<>(); - for (Integer id : mapHistory.keySet()) { - historyList.add(mapHistory.get(id).task); + Node copyHead = head; + while (copyHead != null) { //идем по копии головы пока не пустая + historyList.add(copyHead.task); + copyHead = copyHead.next; //копия головы ссылается теперь на соседа справа } return historyList; } @@ -56,29 +56,36 @@ public List getHistory() { return getTasks(); } - private void linkLast(Task task) { - head = new Node(tail, task, head); + private Node linkLast(Task task) { + final Node oldTail = tail; + Node newNode = new Node(oldTail , task, null); //создаем узел + if (oldTail == null) { //если соседа слева нет + head = newNode; //голова новый узел + } else { + oldTail.next = newNode; // у соседа слева делаем ссылку на новый узел + } + tail = newNode; //теперь хвост ссылается на новый узел + return tail; } private void removeNode(int id) { final Node node = mapHistory.remove(id); - if (node == null) { + if (node == null) { //Если узлов не было return; } - if (node.prev != null) { - node.prev.next = node.next; - if (node.next == null) { - head = node.prev; - head.next = null; + if (node.prev != null) { //Если есть узел слева + node.prev.next = node.next; //переписываем у соседа слева ссылку на соседа справа + if (node.next == null) { //но если соседа справа нет + tail = node.prev; //хвост списка сосед слева } else { - node.next.prev = node.prev; + node.next.prev = node.prev; //сосед справа хвостом ссылается на соседа слева } - } else { - tail = node.next; - if (tail == null) { - head = null; + } else { //Если это первый узел + head = node.next; //голова ссылается на соседа справа + if (head == null) { // + tail = null; } else { - tail.prev = null; + head.prev = null; } } } @@ -87,4 +94,11 @@ private void removeNode(int id) { public void remove(int id) { removeNode(id); } + + @Override + public void deleteHistory() { //для тестов + mapHistory.clear(); + tail = null; + head = null; + } } diff --git a/src/managers/InMemoryTaskManager.java b/src/managers/InMemoryTaskManager.java index 0347c8a..29004c7 100644 --- a/src/managers/InMemoryTaskManager.java +++ b/src/managers/InMemoryTaskManager.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class InMemoryTaskManager implements TaskManager { @@ -197,4 +198,12 @@ public void checkStatus(Epic epic) { epic.setStatus(TaskStatus.NEW); } } + + public List getHistory() { + return historyManager.getHistory(); + } + + public void deleteHistory() { + historyManager.deleteHistory(); + } } \ No newline at end of file From 6faa8ebc86a138bd3d3ebed63432c71122fcd65d Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 14 Aug 2025 22:54:17 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D0=BE=D0=B4=20?= =?UTF-8?q?=D1=84=D0=B76?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/managers/InMemoryHistoryManagerTest.java | 41 +++++++++++++++++-- test/managers/InMemoryTaskManagerTest.java | 2 + test/managers/ManagersTest.java | 2 + test/tasks/EpicTest.java | 2 + test/tasks/SubtaskTest.java | 2 + test/tasks/TaskTest.java | 2 + 6 files changed, 47 insertions(+), 4 deletions(-) diff --git a/test/managers/InMemoryHistoryManagerTest.java b/test/managers/InMemoryHistoryManagerTest.java index 69c27e3..d1f7883 100644 --- a/test/managers/InMemoryHistoryManagerTest.java +++ b/test/managers/InMemoryHistoryManagerTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import tasks.Task; import tasks.TaskStatus; @@ -20,21 +21,53 @@ public void createHistoryManager() { } @Test + @DisplayName("Проверка что Таск в истории меняет статус если мы его поменяли и добавили в список") public void testHistoryAddWithChangeTaskStatus() { Task task = new Task("переезд", "переезд в другой город", TaskStatus.NEW); historyManager.add(task); assertEquals(1, historyManager.getHistory().size(), "Задача не добавлена"); task.setStatus(TaskStatus.IN_PROGRESS); historyManager.add(task); - assertEquals(TaskStatus.NEW, historyManager.getHistory().get(0).getStatus()); + assertEquals(TaskStatus.IN_PROGRESS, historyManager.getHistory().get(0).getStatus()); } @Test + @DisplayName("Проверка добавления тасков в историю их количества") void add() { - Task task = new Task("переезд", "переезд в другой город", TaskStatus.NEW); - historyManager.add(task); + Task task1 = new Task("1", "тело1", TaskStatus.NEW); + task1.setId(1); + historyManager.add(task1); + Task task2 = new Task("2", "тело2", TaskStatus.IN_PROGRESS); + task2.setId(2); + historyManager.add(task2); final List history = historyManager.getHistory(); assertNotNull(history, "После добавления задачи, история не должна быть пустой."); - assertEquals(1, history.size(), "После добавления задачи, история не должна быть пустой."); + assertEquals(2, history.size(), "После добавления задачи, история не должна быть пустой."); + + } + + @Test + @DisplayName("Проверка удаления Таска из истории") + public void remove() { + Task task = new Task("переезд", "переезд в другой город", TaskStatus.NEW); + final List history = historyManager.getHistory(); + historyManager.add(task); + historyManager.remove(task.getId()); + assertNotNull(history, "История должна быть пустой после удаления"); + } + + @Test + @DisplayName("Проверка корректного расположения таска после повторного получения его") + public void testHistoryChangePositions() { + Task task1 = new Task("1", "тело1", TaskStatus.NEW); + task1.setId(1); + historyManager.add(task1); + Task task2 = new Task("2", "тело2", TaskStatus.IN_PROGRESS); + task2.setId(2); + historyManager.add(task2); + final List history1 = historyManager.getHistory(); + historyManager.add(task1); + final List history2 = historyManager.getHistory(); + assertNotEquals(history1, history2, "Списки должны различаться расположением элементов"); } } \ No newline at end of file diff --git a/test/managers/InMemoryTaskManagerTest.java b/test/managers/InMemoryTaskManagerTest.java index 3ba1ce0..26f5718 100644 --- a/test/managers/InMemoryTaskManagerTest.java +++ b/test/managers/InMemoryTaskManagerTest.java @@ -1,6 +1,7 @@ package managers; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import tasks.Epic; import tasks.Task; @@ -18,6 +19,7 @@ public void createTaskManager() { } @Test + @DisplayName("Проверка присвоения разных id") public void getDifferentTypes() { Task task = new Task("Таск", "Тело таска", TaskStatus.NEW); taskManager.addTask(task); diff --git a/test/managers/ManagersTest.java b/test/managers/ManagersTest.java index 3e05c8b..53b09c5 100644 --- a/test/managers/ManagersTest.java +++ b/test/managers/ManagersTest.java @@ -1,5 +1,6 @@ package managers; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -7,6 +8,7 @@ class ManagersTest { @Test + @DisplayName("Проверка создания менеджеров") public void createManager() { HistoryManager historyManager = Managers.getDefaultHistory(); TaskManager taskManager = Managers.getDefault();; diff --git a/test/tasks/EpicTest.java b/test/tasks/EpicTest.java index 24a1f04..51682dd 100644 --- a/test/tasks/EpicTest.java +++ b/test/tasks/EpicTest.java @@ -3,6 +3,7 @@ import managers.Managers; import managers.TaskManager; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; @@ -19,6 +20,7 @@ public void createTaskManager() { } @Test + @DisplayName("Добавление эпика") void addNewEpic() { Epic epic = new Epic("Эпик", "Тело эпика",TaskStatus.NEW); taskManager.addEpic(epic); diff --git a/test/tasks/SubtaskTest.java b/test/tasks/SubtaskTest.java index 9a497f7..f78f15c 100644 --- a/test/tasks/SubtaskTest.java +++ b/test/tasks/SubtaskTest.java @@ -3,6 +3,7 @@ import managers.Managers; import managers.TaskManager; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; @@ -19,6 +20,7 @@ public void createTaskManager() { } @Test + @DisplayName("Добавление подзадачи") void addNewSubtask() { Epic epic = new Epic("Эпик", "Тело эпика",TaskStatus.NEW); taskManager.addEpic(epic); diff --git a/test/tasks/TaskTest.java b/test/tasks/TaskTest.java index ad69675..3e9f27f 100644 --- a/test/tasks/TaskTest.java +++ b/test/tasks/TaskTest.java @@ -4,6 +4,7 @@ import managers.Managers; import managers.TaskManager; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; @@ -20,6 +21,7 @@ public void createTaskManager() { } @Test + @DisplayName("Добавление задачи") void addNewTask() { Task task = new Task("Таск", "Тело таска",TaskStatus.NEW); taskManager.addTask(task); From 13879d661f07b520118fb7cea2a82e2ba7d31d81 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 14 Aug 2025 22:56:23 +0300 Subject: [PATCH 6/7] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=20=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8=D0=B8?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BD=D0=BE=20=D1=84?= =?UTF-8?q?=D0=B76=20=D0=B8=20=D0=B4=D0=BE=D0=BF.=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B5=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 36 ++++++++++++++++++++++++ src/managers/InMemoryHistoryManager.java | 36 +++++++++++++----------- src/managers/InMemoryTaskManager.java | 36 +++++++++++++++++++----- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/src/Main.java b/src/Main.java index a69d0ed..4bb3b69 100644 --- a/src/Main.java +++ b/src/Main.java @@ -105,6 +105,42 @@ public static void main(String[] args) { inMemoryTaskManager.getTaskForId(task10.getId()); System.out.println("обратились к первому должен появится в конце и пропасть в начале"); System.out.println(inMemoryTaskManager.getHistory()); + System.out.println("Доп задание"); + System.out.println(); + + Epic epic01 = new Epic("Эпик1", "Описание 1",TaskStatus.NEW); + inMemoryTaskManager.addEpic(epic01); + Subtask subtask01 = new Subtask("подзадача 1", "тело", epic01.getId(), TaskStatus.NEW); + Subtask subtask02 = new Subtask("подзадача 2", "тело", epic01.getId(), TaskStatus.NEW); + Subtask subtask03 = new Subtask("подзадача 3", "тело", epic01.getId(), TaskStatus.NEW); + inMemoryTaskManager.addSubtask(subtask01); + inMemoryTaskManager.addSubtask(subtask02); + inMemoryTaskManager.addSubtask(subtask03); + Epic epic02 = new Epic("Эпик2", "Описание 1",TaskStatus.IN_PROGRESS); + inMemoryTaskManager.addEpic(epic02); + System.out.println("Пустой список"); + inMemoryTaskManager.deleteHistory(); + System.out.println(inMemoryTaskManager.getHistory()); + inMemoryTaskManager.getEpicForId(epic01.getId()); + System.out.println("Первый эпик"); + System.out.println(inMemoryTaskManager.getHistory()); + inMemoryTaskManager.getSubtaskForId(subtask01.getId()); + System.out.println("Прибавили подзадачу 1 первого эпика"); + System.out.println(inMemoryTaskManager.getHistory()); + inMemoryTaskManager.getSubtaskForId(subtask03.getId()); + System.out.println("Прибавили подзадачу 3 первого эпика"); + System.out.println(inMemoryTaskManager.getHistory()); + inMemoryTaskManager.getSubtaskForId(subtask01.getId()); + System.out.println("Подзадача 1 первого эпика должна быть в хвосте"); + System.out.println(inMemoryTaskManager.getHistory()); + inMemoryTaskManager.removeSubtaskForId(subtask03.getId()); + System.out.println("Удалили подзадачу 3 эпика 1"); + System.out.println(inMemoryTaskManager.getHistory()); + inMemoryTaskManager.removeEpicForId(epic01.getId()); + System.out.println("Удалили эпик с подзадачей"); + System.out.println(inMemoryTaskManager.getHistory()); + + diff --git a/src/managers/InMemoryHistoryManager.java b/src/managers/InMemoryHistoryManager.java index 36ff1fb..cb2481c 100644 --- a/src/managers/InMemoryHistoryManager.java +++ b/src/managers/InMemoryHistoryManager.java @@ -69,24 +69,28 @@ private Node linkLast(Task task) { } private void removeNode(int id) { - final Node node = mapHistory.remove(id); - if (node == null) { //Если узлов не было - return; - } - if (node.prev != null) { //Если есть узел слева - node.prev.next = node.next; //переписываем у соседа слева ссылку на соседа справа - if (node.next == null) { //но если соседа справа нет - tail = node.prev; //хвост списка сосед слева - } else { - node.next.prev = node.prev; //сосед справа хвостом ссылается на соседа слева + if (mapHistory.containsKey(id)) { //если история содержит элемент с id нужно для удаления + final Node node = mapHistory.remove(id); + if (node == null) { //Если узлов не было + return; } - } else { //Если это первый узел - head = node.next; //голова ссылается на соседа справа - if (head == null) { // - tail = null; - } else { - head.prev = null; + if (node.prev != null) { //Если есть узел слева + node.prev.next = node.next; //переписываем у соседа слева ссылку на соседа справа + if (node.next == null) { //но если соседа справа нет + tail = node.prev; //хвост списка сосед слева + } else { + node.next.prev = node.prev; //сосед справа хвостом ссылается на соседа слева + } + } else { //Если это первый узел + head = node.next; //голова ссылается на соседа справа + if (head == null) { // + tail = null; + } else { + head.prev = null; + } } + } else { + return; } } diff --git a/src/managers/InMemoryTaskManager.java b/src/managers/InMemoryTaskManager.java index 29004c7..223544c 100644 --- a/src/managers/InMemoryTaskManager.java +++ b/src/managers/InMemoryTaskManager.java @@ -46,11 +46,17 @@ public ArrayList getAllSubtask() { @Override public void deleteTaskList() { + for (Integer id : taskList.keySet()) { + historyManager.remove(id); + } taskList.clear(); } @Override public void deleteAllSubtask() { + for (Integer id : subtaskList.keySet()) { + historyManager.remove(id); + } subtaskList.clear(); for (Epic epic : epicList.values()) { //идем по списку эпиков checkStatus(epic); @@ -59,17 +65,28 @@ public void deleteAllSubtask() { @Override public void deleteAllEpic() { + for (Integer id : epicList.keySet()) { + historyManager.remove(id); + } epicList.clear(); + for (Integer id : subtaskList.keySet()) { + historyManager.remove(id); + } subtaskList.clear(); } @Override - public void deleteEpicSubtask(Epic epic) { - for (Integer id : subtaskList.keySet()) { - if (id.equals(epic.getId())) { - subtaskList.remove(id); + public void deleteEpicSubtask(Epic epic) { //удаление подзадача по переданному эпику + List idToRemove = new ArrayList<>(); + for (Subtask subtask : subtaskList.values()) { + if (subtask.getEpicId() == epic.getId()) { + idToRemove.add(subtask.getId()); } } + for (Integer key : idToRemove) { + subtaskList.remove(key); + historyManager.remove(key); + } checkStatus(epic); } @@ -82,12 +99,17 @@ public void removeTaskForId(Integer id) { @Override public void removeEpicForId(Integer id) { epicList.remove(id); - for (Subtask subtask : subtaskList.values()) { //удаляем подзадачи которые не существуют без эпика + historyManager.remove(id); //чтобы избежать ConcurrentModificationException + List idToRemove = new ArrayList<>(); //формируем список на удаление + for (Subtask subtask : subtaskList.values()) { //ищем подзадачи по id удаляемого эпика if (subtask.getEpicId() == id) { - subtaskList.remove(subtask.getId()); + idToRemove.add(subtask.getId()); } } - historyManager.remove(id); + for (Integer key : idToRemove) { + subtaskList.remove(key); + historyManager.remove(key); + } } @Override From 13b9da7ef8263334e0e6262c15984d28d2d36043 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 14 Aug 2025 23:17:32 +0300 Subject: [PATCH 7/7] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20checkstyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/InMemoryHistoryManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/InMemoryHistoryManager.java b/src/managers/InMemoryHistoryManager.java index cb2481c..7fd9140 100644 --- a/src/managers/InMemoryHistoryManager.java +++ b/src/managers/InMemoryHistoryManager.java @@ -58,7 +58,7 @@ public List getHistory() { private Node linkLast(Task task) { final Node oldTail = tail; - Node newNode = new Node(oldTail , task, null); //создаем узел + Node newNode = new Node(oldTail, task, null); //создаем узел if (oldTail == null) { //если соседа слева нет head = newNode; //голова новый узел } else {