require_relative 'data_list_student_short' class Students_list_txt attr_reader :students def initialize(filename) @filename = filename @students = [] end # Чтение всех значений из файла. # Предполагается, что каждая строка файла соответствует формату, # который понимает метод Student.from_string. def load_from_file if File.exist?(@filename) File.open(@filename, 'r') do |file| @students = file.each_line.map do |line| line = line.strip next if line.empty? begin Student.from_string(line) rescue ArgumentError => e warn "Ошибка при парсинге строки: #{line}. #{e.message}" nil end end.compact end else @students = [] end self end # Запись всех значений в файл. # Для записи используется формат, возвращаемый методом to_s у объекта Student. def save_to_file File.open(@filename, 'w') do |file| @students.each do |student| file.puts student.to_s end end self end # Получить объект класса Student по ID. def get_student_by_id(id) @students.find { |s| s.id.to_s == id.to_s } end # Получить список из k элементов, начиная с (n-1)*k-й записи, в виде объекта DataList. # Если передан существующий объект data_list, то его список обновляется. # При выборке сначала выполняется сортировка по фамилии и инициалам. # # Пример: k = 20, n = 2 даст вторую «страницу» из 20 элементов. def get_k_n_student_short_list(k, n, data_list = nil) start_index = (n - 1) * k # Сортировка по ФамилияИнициалы sorted_students = @students.sort_by { |s| s.surname_initials } selected_students = sorted_students[start_index, k] || [] # Преобразуем объекты Student в StudentShort short_objects = selected_students.map { |s| StudentShort.from_student(s) } if data_list && data_list.is_a?(DataList) if data_list.respond_to?(:items=) data_list.items = short_objects else data_list = DataListStudentShort.new(short_objects) end data_list else DataListStudentShort.new(short_objects) end end # Сортировать список студентов по ФамилияИнициалы. def sort_students! @students.sort_by! { |s| s.surname_initials } end # Добавить объект Student в список (при добавлении формируется новый ID). # Новый ID вычисляется как (максимальный существующий id + 1) или 1, если список пуст. def add_student(student) new_id = if @students.empty? 1 else max_id = @students.map { |s| s.id.to_i }.max max_id + 1 end student.id = new_id.to_s @students << student student end # Заменить элемент списка по ID. # Если элемент найден, новый объект получает тот же ID. def update_student_by_id(id, new_student) index = @students.find_index { |s| s.id.to_s == id.to_s } if index new_student.id = @students[index].id @students[index] = new_student true else false end end # Удалить элемент списка по ID. # Возвращает true, если удаление прошло успешно. def delete_student_by_id(id) initial_count = @students.size @students.reject! { |s| s.id.to_s == id.to_s } initial_count != @students.size end # Получить количество студентов в списке. def get_student_short_count @students.size end end