#delphi #delphi_7
Нужно сделать прогу, которая бы сортировала список по определённому полю. Но писать самому сортировку лень. Есть ли встроенные процедуры в Delphi?
Ответы
Ответ 1
В Delphi есть TList который может хранить произвольные типы данных и позволяет их сортировать. Метод TList.Sort(), в качестве аргумента принимает вашу функцию сортировки. Сортировка списка проводится внутри TList (используется QuickSort), но каждая пара элементов сравнивается, вызывая функцию, которую вы указали для этого метода. Минимальный пример, который показывает как можно отсортировать список по тому или иному полю, просто подставив нужную функцию сортировки: uses Classes, SysUtils; type TListItem = record F1: string; F2: Integer; end; PListItem = ^TListItem; function CompareByF1(Item1, Item2: Pointer): Integer; begin Result := CompareText(PListItem(Item1).F1, PListItem(Item2).F1); end; function CompareByF2(Item1, Item2: Pointer): Integer; begin Result := PListItem(Item1).F2 - PListItem(Item2).F2; end; procedure Test; var I: Integer; VList: TList; VTestItem: PListItem; begin VList := TList.Create; try try // заполнение списка данными for I := 9 downto 0 do begin New(VTestItem); // динамическое выделение памяти для элемента списка VTestItem.F1 := 'TestStr#' + IntToStr(I); VTestItem.F2 := I; VList.Add(VTestItem); end; // тестовая перчать списка ДО сортировки for I := 0 to VList.Count - 1 do begin Writeln(PListItem(VList.Items[I]).F1); end; Writeln; VList.Sort(CompareByF2); // сортировка по нужному нам полю // тестовая перчать списка ПОСЛЕ сортировки for I := 0 to VList.Count - 1 do begin Writeln(PListItem(VList.Items[I]).F1); end; finally for I := 0 to VList.Count - 1 do begin Dispose(VList.Items[I]); // освобождение ранее выделенной памяти end; end; finally VList.Free; end; end; А вот тут: How do I sort a generic list using a custom comparer? есть пример, как сортировать список, в версиях Delphi с поддержкой дженериков.
Комментариев нет:
Отправить комментарий