Я хочу заказать список строк с различными опциями.
Варианты:
- Сортировка по алфавиту или логическая сортировка
- с учетом регистра или без учета регистра
- по возрастанию или по убыванию
У меня есть все ветки, кроме:
С учетом регистра, Логическая сортировка.
(В значительной степени NatSort от php)
Теперь я пытаюсь найти функцию, которая делает то, что мне нужно.
Чтобы получить логический порядок без учета регистра, я реализовал вызов функции StrCmpLogicalW в shlwapi.dll
https://docs.microsoft.com/en-us/windows/desktop/api/shlwapi/nf-shlwapi-strcmplogicalw
Однако я не могу найти регистрозависимый эквивалент StrCmpLogicalW.
Я скопировал функцию, которая казалась многообещающей, с другой онлайн-доски и поиграл с флагами.
Original-Function:
function NatCompareText(const S1, S2: WideString): Integer;
begin
SetLastError(0);
Result:=CompareStringW(LOCALE_USER_DEFAULT,
NORM_IGNORECASE or
NORM_IGNORENONSPACE or
NORM_IGNORESYMBOLS,
PWideChar(S1),
Length(S1),
PWideChar(S2),
Length(S2)) - 2;
case GetLastError of
0: ;
//some ErrorCode-Handling
else
RaiseLastOSError;
end;
end;
От:
https://www.delphipraxis.net/29910-natuerliche-sortierungen-von-strings.html
Я пытался убрать флаг Ignore-Case, но безрезультатно.
Вот что я хочу в результате:
http://php.fnlist.com/array/natsort
Input: array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
Output: array("Img1.png", "Img2.png", "Img12.png", "iMg10.png")
в отличие от:
http://php.fnlist.com/array/natcasesort
Input: array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
Output: array("Img1.png", "Img2.png", "iMg10.png", "Img12.png")
UPDATE:
Я выполнил первое и очень простое решение для естественной сортировки с учетом регистра.
Причина, по которой я это делаю, заключается в том, что я хочу отсортировать Stringgrid по нескольким столбцам с разными параметрами для каждого указанного столбца.
Чтобы реализовать нацорт, я разбиваю строки на части символов и числовые части и сохраняю каждую часть в списке строк.
оба списка следуют шаблону («символьная часть», «числовая часть», «символьная часть», ... и т. Д.).
после разделения строк я сравниваю записи списка друг с другом.
- числовые части вычитаются друг из друга (num1-num2)
- для сравнения строк я использую CompareStr, а не AnsiCompareStr, поскольку он выдает тот же результат, что и функция php-natsort, с которой я связан выше.
если в любой момент результат сравнения отличается от 0, то дальнейшее сравнение не требуется, и я избегаю цикла.
На мой взгляд, решение еще не завершено, поскольку тема естественной сортировки очень широка, по крайней мере, распознавание отрицательных чисел все еще необходимо реализовать.
Как только я закончу, я опубликую свой код здесь для всех, кто хочет иметь возможность сортировки Stringgrids по нескольким столбцам и с различными опциями для каждого столбца, поскольку я пока не смог найти такой код в Интернете.
Я не могу полагаться на сторонние инструменты, такие как RegEx для этого.
Моя главная точка отсчета в настоящее время эта ссылка:
https://natsort.readthedocs.io/en/master/howitworks.html