Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сортировка объектов `TPerson` в Delphi XE10: упорядочивание по имени и дате рождения

Delphi , Компоненты и Классы , Списки

Сортировка списка объектов 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 08:36:38/0.0059800148010254/0