Сортировка списка объектов TPerson в Delphi: упорядочивание по имени и дате рождения
Вопрос, который часто возникает при работе с коллекциями объектов в Delphi, заключается в необходимости их сортировки по нескольким полям. В данном случае рассмотрим задачу сортировки списка объектов TPerson по имени и дате рождения.
Описание задачи
Допустим, у нас есть класс TPerson с двумя полями: name (имя) и DateOfBirth (дата рождения). Нам нужно отсортировать список объектов TPerson сначала по имени, а затем внутри групп с одинаковыми именами — по дате рождения.
Пример класса TPerson
TPerson = class
private
name: string;
DateOfBirth: TDatetime;
end;
Исходный список объектов
Вот пример списка объектов, который требуется отсортировать:
| Имя | Дата рождения |
|------------|---------------|
| Adam | 01/01/2023 |
| Alice | 01/02/2023 |
| Adam | 01/01/2022 |
Попытка сортировки
Пользователь пытался отсортировать список, используя компаратор, который сравнивает имена, но внутри групп с одинаковыми именами сортировка по дате рождения не выполняется.
Решение задачи
Для решения задачи необходимо изменить компаратор таким образом, чтобы он сначала сравнивал имена, а затем, если имена совпадают, сравнивал даты рождения.
aList.Sort(TComparer<TPerson>.Construct(
function (const L, R: TPerson): Integer
begin
if L.Name = R.Name then
begin
if L.DateOfBirth = R.DateOfBirth then
Result := 0
else if L.DateOfBirth < R.DateOfBirth then
Result := -1
else
Result := 1;
end
else if L.Name < R.Name then
Result := -1
else
Result := 1;
end));
Альтернативный подход
Также можно использовать встроенные функции сравнения из RTL:
aList.Sort(TComparer<TPerson>.Construct(
function (const L, R: TPerson): Integer
begin
Result := CompareText(L.Name, R.Name);
if Result = 0 then
Result := Compare(L.DateOfBirth, R.DateOfBirth);
Result := -Result;
end));
Обратите внимание, что в последнем примере используется функция CompareText для строк и Compare для дат, а также инвертируется результат сравнения, чтобы сортировка шла в обратном лексикографическом порядке (как обычно принято для сортировки в алфавитном порядке).
Заключение
Таким образом, задача сортировки списка объектов TPerson по имени и дате рождения решена. В зависимости от предпочтений и контекста задачи, можно выбрать один из предложенных вариантов реализации компаратора.
Задача заключается в сортировке списка объектов `TPerson` в Delphi, где сначала происходит сортировка по имени, а затем, при равенстве имен, по дате рождения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.