You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kubsu-sm5-ruby/lab2/students_list_txt.rb

120 lines
4.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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