Сортировка строк в Delphi с учетом регистра и логические сравнения: расширенная функция для Unicode
Сортировка строк в Delphi может быть выполнена различными способами в зависимости от требований к порядку сравнения символов и числовых значений. В частности, задача может заключаться в реализации сортировки, аналогичной функционалу natcasesort и natsort из PHP, которая учитывает числовые значения и регистр символов.
Задача
Разработчик столкнулся с необходимостью реализации функции сортировки строк в Delphi, которая поддерживает следующие опции:
Алфавитное или логическое сравнение
Учет или игнорирование регистра
Упорядочивание по возрастанию или убыванию
Примеры входных и выходных данных:
Входные данные: array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
Выходные данные (без учета регистра): array("Img1.png", "Img2.png", "Img12.png", "iMg10.png")
Выходные данные (с учетом регистра): array("Img1.png", "Img2.png", "iMg10.png", "Img12.png")
Решение
Для решения задачи разработчик использовал функцию StrCmpLogicalW из библиотеки shlwapi.dll, которая предназначена для логического сравнения строк с учетом числовых значений, но без учета регистра. Для реализации сортировки с учетом регистра была разработана функция StringCompareLogicalCaseSensitiveASC, которая разделяет строки на числовые и не числовые части, а затем сравнивает их.
Пример кода
type TSortOrder = (soAscending, soDescending);
type TSortOption = record
SortOrder: TSortOrder; // Определяет порядок сортировки в записи TSortOption, может быть заменен на Boolean, но предпочтительнее использовать перечисления
CaseSensitive: Boolean;
SortLogical: Boolean;
end;
type TSortOptions = Array of TSortOption;
procedure SortGridByColumns(Grid: TStringGrid; Columns: array of Integer; Options: TSortOptions);
begin
// Код процедуры SortGridByColumns
end;
Процедура сортировки строк в StringGrid
// ...
procedure SortGridByColumns(Grid: TStringGrid; Columns: array of Integer; Options: TSortOptions);
type
TshlwapiStrCmpLogicalW = function(psz1, psz2: PWideChar): Integer; stdcall; // Объявление нового типа функции для использования переменных этого типа
var
i, j: Integer;
InternalColumns: Array of Integer;
InternalOptions: TSortOptions;
Sorted: Boolean;
shlwapi: HMODULE;
StrCmpLogicalW: TshlwapiStrCmpLogicalW;
// ...
begin
// Код процедуры, включая определение вспомогательных функций для сравнения строк
// ...
end;
// Функция сортировки строк с учетом логического сравнения и регистра
function StringCompareLogicalCaseSensitiveASC(const String1, String2: String): Integer;
begin
// ...
end;
// ... другие вспомогательные функции для сравнения строк с учетом регистра и логического сравнения
// Функция выполнения логики сортировки на основе предоставленных параметров сортировки
function ExecuteSortLogic(StringRow1, StringRow2: String; ColumnOption: TSortOption): Integer;
begin
// ...
end;
// Контроллер сортировки, который перебирает столбцы и сортирует их до тех пор, пока не будет достигнут конечный столбец массива столбцов или пока результат сравнения не станет отличным от нуля
function Sort(Row1, Row2: Integer; SortOptions: TSortOptions): Integer;
begin
// ...
end;
function IsIntegerInArray(AnInt: Integer; AnArray: Array of Integer): Boolean;
begin
// ...
end;
begin
// Инициализация и выполнение сортировки
// ...
end;
Заключение
Для реализации расширенной функции сортировки в Delphi с учетом логического сравнения и регистра строки были разделены на числовые и не числовые части, после чего каждый тип частей был обработан соответствующим образом. Это позволило достичь результата, аналогичного функционалу natcasesort и natsort из PHP, и применить его для сортировки данных в StringGrid с различными параметрами для каждого столбца.
Разработчик также отметил, что текущее решение является упрощенным и требует дальнейшей доработки, включая обработку отрицательных чисел, нормализацию Unicode, числовые сокращения, локальные наборы символов и другие случаи, которые могут быть необходимы в будущем.
Разработчик в Delphi реализует функцию сортировки строк, поддерживающую логические сравнения, учет регистра и различные порядки сортировки, аналогично PHP функциям `natcasesort` и `natsort`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.