Как получить порядок сортировки в Delphi, как в Проводнике Windows?
уплотнения:
- терминология, которую я был поиск кажется " естественным род."
-
для действий в операционных системах:
- для Windows (версия >= XP), Проводник Windows использует естественный род.
- для терминалов Linux: используйте "ls-v" вместо простого "ls", чтобы получить естественный род.
для программирования в Delphi используйте STRCMPLOGICALW Windows API для получения естественной сортировки.
- для программирования в Delphi & Kylix & Lazarus используйте функции ручной работы, чтобы получить
натуральный сорт:
- (1) Delphi wrapper для сравнения строк естественного порядка по Martin Pool.
http://irsoft.de/web/strnatcmp-and-natsort-for-delphi - (2) коды алгоритма сортировки букв на других языках с сайта davekeolle.
http://www.davekoelle.com/alphanum.html - (3) другое knowledgable pages:
http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html
http://objectmix.com/delphi/722211-natural-sorting-optimizing-working-solution.html
http://groups.google.com/group/borland.public.delphi.language.delphi.general/browse_thread/thread/1141d49f8bbba577
http://objectmix.com/delphi/401713-alphanumeric-sort-routine-delphi.html
- (1) Delphi wrapper для сравнения строк естественного порядка по Martin Pool.
==========================
следующие имена файлов будут упорядочены в Проводнике Windows, как показано ниже:
test_1_test.txt
test_2_test.txt
test_11_test.txt
test_12_test.txt
test_21_test.txt
test_22_test.txt
Если, например, я помещаю их в экземпляр TStringList и вызываю сортировку, порядок сортировки выглядит так ниже:
test_1_test.txt
test_11_test.txt
test_12_test.txt
test_2_test.txt
test_21_test.txt
test_22_test.txt
и для записи вышеуказанные имена файлов будут упорядочены в терминале rxvt Cygwin или xterm терминала дистрибутивов Linux, таких как CentOS, как показано на рисунке ниже:
test_11_test.txt
test_12_test.txt
test_1_test.txt
test_21_test.txt
test_22_test.txt
test_2_test.txt
не могли бы вы прокомментировать, как понять эту разницу в поведении сортировки? Кроме того, можно ли получить тот же порядок, что и в Проводнике Windows? Любое предложение приветствуется!
PS: моя локаль Windows установлена на китайский, но я бы подумал, что то же самое для английского языка.
2 ответов
StrCmpLogicalW способен обрабатывать числа, Другой альтернативой является функции comparestring
спасибо Андерсу-ответ StrCmpLogicalW; я не нашел его объявление в источниках Delphi 2009, поэтому я объявил его сам в тесте ниже:
type
TMyStringList = class(TStringList)
protected
function CompareStrings(const S1, S2: string): Integer; override;
end;
function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dll';
function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
Result:= StrCmpLogicalW(PChar(S1), PChar(S2));
end;
procedure TForm11.Button2Click(Sender: TObject);
var
SL: TMyStringList;
begin
SL:= TMyStringList.Create;
try
SL.Add('test_1_test.txt');
SL.Add('test_11_test.txt');
SL.Add('test_12_test.txt');
SL.Add('test_2_test.txt');
SL.Add('test_21_test.txt');
SL.Add('test_22_test.txt');
SL.Sort;
Memo1.Lines:= SL;
finally
SL.Free;
end;
end;