Домашнее задание №9. Интерфейсы, сортировка с компаратором.
Требуемые условия завершения
Открыто с: понедельник, 22 апреля 2019, 00:00
Срок сдачи: понедельник, 29 апреля 2019, 00:00
Интерфейсы
Интерфейс IComparable<T>
Дан текстовый файл, содержащий температурные данные в различных единицах измерения и их описания, например:
0C Замерзание воды
97,9F Норма человеческого тела
100С Кипение воды
3780К Кипение углерода
0K Абсолютный ноль
1356,55K Плавление меди
0F Замерзание дурацкой смеси
- Определите класс
Temperature
с тремя закрытыми полями:tempk
— температура в градусах Кельвина (вещественное число);orig
— исходное представление температуры (строка);desc
— описание температуры (строка).
- Реализуйте конструктор, принимающий на вход два строковых значения: температуру и её описание. Конструктор должен генерировать исключение, если температурное значение является некорректным (например, находится ниже абсолютного нуля). Добавьте числовые свойства
C
,F
иK
для чтения температуры в соответствующей системе. Определите строковое свойствоDescription
для чтения описания. Переопределите методToString
(он должен возвращать исходное представление температуры вместе с её описанием). В основной программе загрузите все температурные данные из исходного файла в списокList<Temperature>
. - Попытайтесь вызвать метод
Sort
для загруженного ранее списка температур. Возникающее при этом исключение свидетельствует о невозможности выполнять сравнение объектов произвольного класса. Чтобы это стало возможным, необходимо, например, реализовать в классе интерфейсIComparable<T>
. Для этого:- измените заголовок класса на следующий
class Temperature : IComparable<Temperature>
— тем самым мы заявляем, что классTemperature
будет реализовывать интерфейсIComparable<Temperature>
, то есть что значения температур можно будет сравнивать между собой; - возникшее теперь сообщение компилятора говорит о необходимости реализовать метод сравнения
public int CompareTo(Temperature other)
— добавьте в класс заготовку для этого метода; - метод сравнения должен возвращать отрицательное число, если объект, для которого вызывается метод, меньше объекта, переданного в качестве параметра,
0
— если оба объекта равны, и положительное число — если исходный объект больше — реализуйте этот метод, сравнивая значения поляtempk
; - поскольку для сравнения температур достаточно сравнить только одно поле, то всю проверку можно поручить соответствующему методу поля
tempk
. Удобно пользоваться CompareTo для типа double
- измените заголовок класса на следующий
- Убедитесь, что метод
Sort
для списка температур теперь работает и сортирует список в порядке возрастания температуры. - Реализуйте сортировку с использованием компаратора так, чтобы он сортировал List<Temperature> по убыванию температуры в градусах Кельвина. (Компаратор должен быть параметром метода и быть задан в виде лямбда - выражения)
Интерфейс IComparer<T>
- Создать класс Point - точка на плоскости с вещественными координатами x, y. Создать конструктор, ToString() и свойства для доступа к координатам точки.
- Создайте метод, который генерирует набор (LIst<Point>) случайно расположенных точек в квадрате [0,1]x[0,1].
- Используя интерфейс IComparer, выведите все точки, упорядочивая их следующими способами:
- по удалению от начала координат (сначала выводится ближайшая к началу координат, порядок равноудалённых точек не важен);
- по удалению от оси абсцисс (сначала выводится ближайшая к оси абсцисс, порядок равноудалённых точек не важен);
- по удалению от оси ординат (сначала выводится ближайшая к оси ординат, порядок равноудалённых точек не важен);
- по удалению от диагонали первой и третьей четвертей (прямая
y=x
, порядок равноудалённых точек не важен).