Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Как реализовать ограниченный лог?

#java


Нужно сделать лог определенного размера в который можно бесконечно добавлять записи
в виде строк но при этом когда некуда будет записывать новые записи старые будут затираться,
мне тяжело сформулировать мысль, покажу на примере кода:

MyLog log = new Mylog(1024); // создание лога размером в 1024 записи
log.add("запись в логе #1"); // добавляем запись
log.add("запись в логе #2"); // ещё добавляем запись
...
log.add("запись в логе #1025); // запись #1 затирается все строки сдвигаются и запись
#1025 становится в конец
String[] arr = log.toArray(); // Возвращает массив из 1024 строк


Как такое оптимальнее всего сделать?  

Возможно есть какое-то название для этого "лога", разновидность стека какая нибудь там?  

Сложность вставки в худшей случае будет O(n) или еще больше?  

И да, возможно есть это в стандартной библиотеке?
    


Ответы

Ответ 1



Думаю можно сделать таким образом: MyLog log = new Mylog(1024); - создается массив из 1024 элемента Курсор при создании = 0 this.cursor = 0; this.perepolneniye = FASLE; функция Add() добавляет запись и передвигает курсор public void add(String logData){ this.cursor ++; if (this.cursor > MAX_SIZE) { this.cursor = 0; this.perepolneniye = TRUE; } logArray[this.cursor] = logData; } Теперь когда нужно все это собрать и распечатать, нужно с начало собрать из cursor + 1 до конца и потом из начало до cursor'а. Но если не было переполнения, тогда только с начало до cursor'а. public void outResult(){ String result = ""; if (this.perepolneniye) { // Собираем от this.cursor+1 до MAX_SIZE } // Собираем от 0 до this.cursor return result; }

Ответ 2



Возможно вам подойдет тип данных очередь (разновидность списка), с той оговоркой, что при добавлении элемента будет проверяться длина очереди и, если надо, последний элемент будет выталкиваться. Сложность вставки будет О(1), но вот получение и изменение n-го элемента будет O(n). В джава нет встроенного типа данных очередь, но есть LinkedList, на основе которого можно легко сделать соответствующий класс: class Log { public int max_log_length; //максимальная длина public LinkedList list; //собственно список элементов public Log(int len) { this.list = new LinkedList(); this.max_log_length = len; } public void addFirst(T t) { this.list.addFirst(t); if (this.list.size() > this.max_log_length) { this.list.removeLast(); } } public T get(int index) { return this.list.get(index); } public void set(int index, T t) { this.list.set(index, t); } } Использовать соответственно так: Log log = new Log(1024); Получить из него массив можно так: String[] log_array = log.list.toArray(new String[b.max_log_length]); Естественно надо еще добавить различные проверки на выход за границы списка и много чего другого.

Комментариев нет:

Отправить комментарий