В данной статье мы рассмотрим вопрос сортировки массива записей в Delphi на основе одного из полей. Для иллюстрации возьмем простой пример, где у нас есть массив записей с полями SortOrder (целое число) и SomethingElse (строка).
type
TExample = record
SortOrder: Integer;
SomethingElse: string;
end;
var
SomeVar: array of TExample;
Альтернативный ответ
Один из способов решения этой задачи - использовать встроенные функции сортировки в Delphi. Для этого мы можем добавить наши записи в список и затем отсортировать его. После сортировки мы можем скопировать отсортированные записи обратно в массив.
var
list: TList<TExample>;
begin
list := TList<TExample>.Create;
try
// Добавляем записи в список
for i := Low(SomeVar) to High(SomeVar) do
list.Add(SomeVar[i]);
// Сортируем список
list.Sort(TComparer<Integer>.Default, TComparer<TExample>.Compare(SortOrder));
// Копируем отсортированные записи обратно в массив
SetLength(SomeVar, list.Count);
for i := 0 to list.Count - 1 do
SomeVar[i] := list[i];
finally
list.Free;
end;
end;
Подтвержденный ответ
Если вы используете Delphi XE или более новую версию, вы можете воспользоваться новым пакетом коллекций, который включает в себя функцию сортировки для массивов. Эта функция принимает в качестве параметра реализацию интерфейса IComparer<TExample>, что позволяет осуществлять пользовательскую сортировку.
type
TDelegatedComparer<T> = class
private
FComparer: TComparer<T>;
public
class function Construct(Comparer: TComparer<T>): TDelegatedComparer<T>; static;
end;
TArray = class helper for array of Object
public
class procedure Sort<T>(var A: array of T; Comparer: TComparer<T> = nil); static;
end;
type
TExample = record
SortOrder: Integer;
SomethingElse: string;
end;
var
SomeVar: array of TExample;
begin
TArray.Sort<TExample>(SomeVar, TDelegatedComparer<TExample>.Construct(
function(const Left, Right: TExample): Integer
begin
Result := TComparer<Integer>.Default.Compare(Left.SortOrder, Right.SortOrder);
end));
end;
Альтернативный ответ
Если вы хотите отсортировать массив по строковому полю, вы можете использовать TStringList и добавить записи с помощью метода AddObject, передавая строку и указатель на целое число.
var
tsExamples: TStringList;
begin
tsExamples := TStringList.Create;
try
// Добавляем записи в TStringList
for i := Low(SomeVar) to High(SomeVar) do
tsExamples.AddObject(SomeVar[i].SomethingElse, Pointer(SomeVar[i].SortOrder));
// Сортируем TStringList
tsExamples.Sort;
// Копируем отсортированные записи обратно в массив
SetLength(SomeVar, tsExamples.Count);
for i := 0 to tsExamples.Count - 1 do
begin
SomeVar[i].SomethingElse := tsExamples[i];
SomeVar[i].SortOrder := Integer(tsExamples.Objects[i]);
end;
finally
tsExamples.Free;
end;
end;
Заключение
В этой статье мы рассмотрели несколько способов сортировки массива записей в Delphi на основе одного из полей. Выбор конкретного способа зависит от версии Delphi, размера массива, типа сортировки и других факторов.
В статье рассматриваются способы сортировки массива записей в Delphi на основе одного из полей, с примерами использования встроенных функций сортировки и пользовательских реализаций интерфейса `IComparer`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.