Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/Main.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

public class Main {

public static void main(String[] args) {
Expand Down
26 changes: 0 additions & 26 deletions src/managers/InMemoryHistoryManager.java

This file was deleted.

31 changes: 30 additions & 1 deletion src/managers/InMemoryTaskManager.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package managers;

import managers.history.HistoryManager;
import model.Epic;
import model.Status;
import model.SubTask;
Expand Down Expand Up @@ -150,11 +151,13 @@ public void deleteTask(int id) {
if (!tasks.containsKey(id)) {
return;
}
historyManager.remove(id); // удаляем из истории
tasks.remove(id);
}

@Override
public void clearTasks() {
clearHistoryTasks();
tasks.clear();
}

Expand All @@ -163,18 +166,24 @@ public void deleteEpic(int id) {
if (!epics.containsKey(id)) {
return;
}

Epic epic = epics.get(id);

for (Integer subtaskId : epic.getSubtaskIds()) { // удаляем из основной таблицы подзадач каждую подзадачу эпика
subtasks.remove(subtaskId);
historyManager.remove(subtaskId); // удаляем из истории
}

historyManager.remove(id); // удаляем из истории
epics.remove(id);

}

@Override
public void clearEpics() {
clearHistoryEpics();
epics.clear();

clearHistorySubTasks();
subtasks.clear();
}

Expand All @@ -190,17 +199,37 @@ public void deleteSubTask(int id) {
epic.deleteSubTask(id);
updateEpicStatus(epic);

historyManager.remove(id); // удаляем из истории
subtasks.remove(id);
}

@Override
public void clearSubTasks() {
clearHistorySubTasks();
subtasks.clear();
for (Epic epic : epics.values()) {
epic.clearSubtasks(); // статус эпика обновляется внутри метода
}
}

private void clearHistoryTasks() {
for (Integer id : tasks.keySet()) {
historyManager.remove(id);
}
}

private void clearHistoryEpics() {
for (Integer id : epics.keySet()) {
historyManager.remove(id);
}
}

private void clearHistorySubTasks() {
for (Integer id : subtasks.keySet()) {
historyManager.remove(id);
}
}

@Override
public List<Task> getHistory() {
return historyManager.getHistory();
Expand Down
3 changes: 3 additions & 0 deletions src/managers/Managers.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package managers;

import managers.history.HistoryManager;
import managers.history.InMemoryHistoryManager;

public class Managers {

public static TaskManager getDefault() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package managers;
package managers.history;

import model.Task;

Expand All @@ -8,6 +8,8 @@ public interface HistoryManager {

void addTask(Task task);

void remove(int id);

List<Task> getHistory();

}
88 changes: 88 additions & 0 deletions src/managers/history/InMemoryHistoryManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package managers.history;

import model.Task;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class InMemoryHistoryManager implements HistoryManager {
private Node head;
private Node tail;

private final HashMap<Integer, Node> history = new HashMap<>();

@Override
public void addTask(Task task) {
if (task == null) {
return;
}
int id = task.getTaskId();
remove(id);
history.put(id, linkLast(task));
}


@Override
public void remove(int id) {
Node node = history.remove(id);
if (node == null) {
return;
}
removeNode(node);
}

@Override
public List<Task> getHistory() {
return getTasks();
}

private Node linkLast(Task task) {
Node newNode = new Node(tail, task, null);

if (tail == null) {
// инициализируем голову, теперь она будет хранить всю последовательность
head = newNode;
} else {
// добавляем новый узел к текущему хвосту
tail.setNext(newNode);
}
tail = newNode; // переопределяем хвост

return newNode;
}

private void removeNode(Node node) {
Node next = node.getNext();
Node prev = node.getPrev();

if (prev == null) {
// переопределяем голову на второй элемент последовательности
head = next;
} else {
// привязываем предыдущий узел к последующему (минуя текущий)
prev.setNext(next);
}

if (next == null) {
// переопределяем хвост на предпоследний элемент последовательности
tail = prev;
} else {
// привязываем к последующему узлу предыдущий (минуя текущий)
next.setPrev(prev);
}

}

private List<Task> getTasks() {
List<Task> tasks = new ArrayList<>();
Node current = head; // копия головы, чтобы избежать потери

// проходим через всю последовательность и добавляем задачу в список
while (current != null) {
tasks.add(current.getTask());
current = current.getNext();
}
return tasks;
}
}
44 changes: 44 additions & 0 deletions src/managers/history/Node.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package managers.history;

import model.Task;

public class Node {

private final Task task;
private Node prev;
private Node next;

public Node(Node prev, Task task, Node next) {
this.task = task;
this.prev = prev;
this.next = next;
}

public Task getTask() {
return task;
}

public Node getPrev() {
return prev;
}

public void setPrev(Node prev) {
this.prev = prev;
}

public Node getNext() {
return next;
}

public void setNext(Node next) {
this.next = next;
}

@Override
public String toString() {
return String.format("task=%s, next=%s",
this.task,
this.next);
}

}
5 changes: 3 additions & 2 deletions src/model/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,18 @@ public String getTitle() {
return title;
}

public void setTitle(String title){
public void setTitle(String title) {
this.title = title;
}

public String getDescription() {
return description;
}

public void setDescription(String description){
public void setDescription(String description) {
this.description = description;
}

public Status getStatus() {
return status;
}
Expand Down
Loading