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
26 changes: 16 additions & 10 deletions src/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import manager.TaskManager;
import manager.TaskManagerType;

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

public class Main {
Expand All @@ -20,12 +19,18 @@ public static void main(String[] args) {
printListAll();

testSubtasks();

printHistory();

testEpics();
testTasks();

printListAll();
printHistory();

testTasks();

printHistory();

printListAll();
}

/// Ввести исходные данные
Expand All @@ -52,21 +57,21 @@ static void insertStartData() {
"Найти девушку для знакомства",
"Использовать различные способы поиска, для ускорения процесса"
));
Subtask subtask1 = manager.setSubTask(new Subtask(
Subtask subtask1 = manager.setSubtask(new Subtask(
null,
"Поиск на сайтах знакомств",
null,
null,
epic1.getId()
));
Subtask subtask2 = manager.setSubTask(new Subtask(
Subtask subtask2 = manager.setSubtask(new Subtask(
null,
"Поиск через знакомых",
null,
null,
epic1.getId()
));
Subtask subtask3 = manager.setSubTask(new Subtask(
Subtask subtask3 = manager.setSubtask(new Subtask(
null,
"Поиск в литературном клубе",
null,
Expand All @@ -79,7 +84,7 @@ static void insertStartData() {
"Оптимизировать поиск девушки",
"Получить результат быстрее и с меньшими затратами"
));
Subtask subtask4 = manager.setSubTask(new Subtask(
Subtask subtask4 = manager.setSubtask(new Subtask(
null,
"Выбрать наиболее оптимальный способ поиска",
null,
Expand All @@ -92,21 +97,21 @@ static void insertStartData() {
"Создать систему оценки способов поиска",
"Без статистики не обойтись"
));
Subtask subtask5 = manager.setSubTask(new Subtask(
Subtask subtask5 = manager.setSubtask(new Subtask(
null,
"Задать параметры системы оценки",
"Возможно бальная система",
null,
epic3.getId()
));
Subtask subtask6 = manager.setSubTask(new Subtask(
Subtask subtask6 = manager.setSubtask(new Subtask(
null,
"Собрать статистику способов",
null,
null,
epic3.getId()
));
Subtask subtask7 = manager.setSubTask(new Subtask(
Subtask subtask7 = manager.setSubtask(new Subtask(
null,
"Провести статистическое исследование",
null,
Expand All @@ -126,6 +131,7 @@ static void printHistory() {
System.out.println(stringBuilder);
i++;
}
System.out.println("\n" + "-".repeat(20) + "\n");
}

/// Вывести все данные
Expand Down
2 changes: 1 addition & 1 deletion src/data/Epic.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void addSubtaskId(Integer subtaskId) {
}

/// Удаление всех ID подзадач
public void removeAllSubTaskIds() {
public void removeAllSubtaskIds() {
subtaskIds.clear();
}

Expand Down
8 changes: 5 additions & 3 deletions src/manager/HistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@

import java.util.List;

public interface HistoryManager<T> {
public interface HistoryManager {

List<T> getHistory();
void add(Task task);

void add(Task taskObject);
void remove(int id);

List<Task> getHistory();
}
116 changes: 105 additions & 11 deletions src/manager/InMemoryHistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,118 @@

import data.Task;

import java.util.ArrayList;
import java.util.List;
import java.util.*;

public class InMemoryHistoryManager<T> implements HistoryManager<T> {
public class InMemoryHistoryManager implements HistoryManager {

private final int maxSize = 10;
private final List<Task> history = new ArrayList<>(maxSize);
private Node first;
private Node last;

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

@Override
public List<T> getHistory() {
return new ArrayList<>((ArrayList<? extends T>) history);
public List<Task> getHistory() {
return getTasks();
}

@Override
public void add(Task taskObject) {
if (history.size() == maxSize) {
history.removeFirst();
public void add(Task task) {
int taskId = task.getId();

if (idToNode.containsKey(taskId)) {
removeNode(idToNode.get(taskId));
}
linkLast(task);
}

@Override
public void remove(int id) {
if (idToNode.containsKey(id)) {
removeNode(idToNode.get(id));
}
}

private void linkLast(Task task) {
Node newLastNode;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если в очереди только одна нода, то на нее должны указывать как first, так и last. По аналогии с очередью например к врачу: единственный пациент, он же ответит я, на вопрос врача кто первый, и так же ответит я, на вопрос нового пациента кто последний.

if (idToNode.isEmpty()) {
newLastNode = new Node(null, task, null);
idToNode.put(task.getId(), newLastNode);
first = newLastNode;
last = newLastNode;
} else if (last == first) {
newLastNode = new Node(first, task, null);
last = newLastNode;
first.next = newLastNode;
} else {
newLastNode = new Node(last, task, null);
last.next = newLastNode;
last = newLastNode;
}

idToNode.put(task.getId(), newLastNode);
}

private ArrayList<Task> getTasks() {
ArrayList<Task> tasks = new ArrayList<>();

if (first == null) {
return tasks;
}

Node node = first;
while (node.next != null) {
tasks.add(node.data);
node = node.next;
}
tasks.add(node.data);

return tasks;
}

private void removeNode(Node node) {

int taskId = node.data.getId();

if (node.prev == null & node.next == null) {
first = null;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

еще нужно обнуллить и last

last = null;
} else if (node.prev == null) {
first = node.next;
first.prev = null;
} else if (node.next == null) {
last = node.prev;
last.next = null;
} else {
node.prev.next = node.next;
node.next.prev = node.prev;
}

idToNode.remove(taskId);
}

static class Node {

public Node prev;
public Task data;
public Node next;

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

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Node node = (Node) o;
return Objects.equals(data, node.data);
}

@Override
public int hashCode() {
return Objects.hashCode(data);
}
history.add(taskObject);
}
}
Loading