Всего несколько (других) замечаний
Дизайн
Вы используете много наследства.Это действительно необходимо?Позже, для производственного кода, вы должны рассмотреть возможность использования композиция вместо наследование и код для интерфейсов.Это удалит много уродливых зависимостей и улучшит удобство обслуживания.Теперь у вас есть
EventSequenceList is-a MemoryList is-a LinkedList is-a Узел
Только из названий у меня есть некоторые сомнения, что LinkedList действительно является узлом.Я ожидаю Узел в деревьях или графиках, и даже там обычно это отношение has-a .
Именование
Иногда вы нарушаете соглашения об именах Java: имена методов не должны начинаться с заглавной буквы (например, Add
).Иногда вы используете имена из одной буквы (как в большинстве ваших конструкторов).
Иногда имя метода не говорит нам, что на самом деле делает метод (например, iterpretFile
, который на самом деле не интерпретирует файлно только одна команда, которая может была прочитана из файла)
Чем больше я смотрю на задание, тем больше у меня возникает ощущение, что вы застрялис вашим дизайном рано или поздно (раньше, чем позже).Из того, что я прочитал, что требуется:
- Один класс модели событий.Класс, представляющий событие вставки или удаления.
- Один класс модели памяти.Класс, представляющий всю память
- Один класс модели сегмента.Класс, который представляет сегмент.Класс памяти имеет список или массив сегментов
- Один связанный список, содержащий все события.Этот пользовательский связанный список может быть способен вставлять событие в нужное место
- Один класс отчетности.Класс, который может создавать и печатать отчет.
- Один анализатор входных файлов.Он будет использовать входные данные для
- создания класса памяти (с соответствующим количеством сегментов)
- создания событий вставки и удаления из
P
строк - вставки событийв связанном списке
Абсолютно нет наследование необходимо.
Редактировать - в ответ на ваши последние комментарии
A Память имеет массив ячеек.Ячейки индексируются, начиная с 0. Они не связаны, поэтому я на самом деле не вижу смысла использовать LinkedList
здесь.Модель памяти может выглядеть следующим образом:
public class Memory {
private int[] cells;
public Memory(int size) { cells = new int[size]; }
public void store(int index, int value) {
if (index < 0 || index >= size) throw new IllegalArgumentException("..");
cells[index] = value;
}
public int read(int index) {
if (index < 0 || index >= size) throw new IllegalArgumentException("..");
return cells[index];
}
}
A сегмент может рассматриваться как подкласс памяти.В реальной жизни сегмент запрашивается у менеджера памяти, и менеджер выделяет регион, если это возможно.Сегменты полностью независимы, никакой связи между ними нет, здесь нет необходимости в LinkedList.Краткий черновик:
public class MemoryManager {
private Memory managedMemory;
public MemoryManager(Memory memory) { this.memory = memory; }
public Segment getSegment(int size) {
int startAddress = allocateSegment(int size);
if (startAddress != -1) {
return new Segment(this, startAddress, size);
}
return null;
}
}
public class Segment extends Memory {
private MemoryManager memoryManager;
private int startAddress; // usually - a handle, so that the memoryManager can
// relocate the segment - we keep it simple
public Segment(MemoryManager memoryManager, int startAdress, int size) {
super(size);
this.memoryManager = memoryManager;
this.startAddress = startAddress;
}
Теперь вернемся к событиям.
Одним из правил этого назначения является создание связанного списка событий [eventList = new EventList<Event>()
] , где вставки и удаления сегментов создаются как события [new Event(EventType.INSERT, int time, Segment segment)); new Event(EventType.DELETE, int time, Segment segment);
] , и мне нужно просмотреть список событий [for(Event event:eventList)
].
Это задача.реализовать класс Event
, реализовать класс EventList
, реализовать небольшое перечисление EventType
.Задача состоит в том, чтобы внедрить метод insert
в EventClass
, который вставляет два события для одной строки P
в нужных местах (отметки времени).