Нужно сделать прогу, которая бы сортировала список по определённому полю. Но писать самому сортировку лень. Есть ли встроенные процедуры в Delphi?
Ответ
В 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 с поддержкой дженериков.
Комментариев нет:
Отправить комментарий