Сортування у TStringList

Сортування в TStringList

Рядковий тип, що використовується вDelphi, доповнюється об'єктомTStringList, який, крім того, що є масивом рядків, має ряд корисних властивостей і методів. Одним з них є можливість сортування - як присвоюванням властивостіsortedзначенняtrue, так і зверненням до методуsort. Результати однакові: рядки переупорядковуються фізично, і наданням властивостіsortedзначенняfalseу вихідний стан порядок рядків не повертає.

Цікавий зміст, вкладений розробниками у фразу "сортування за абеткою". При роботі з не-юнікодним кодуванням таке сортування сильно відрізняється від упорядкування за кодами символів. Для ілюстрації цього я написав проект, що складається зі списку (TListBox) та двох перемикачів (TCheckBox). Кліки поCheckBox1повинні демонструвати символи та їх коди (32-255) у природному та відсортованому за стандартним алгоритмом порядку, а>CheckBox2- роботу методуCustomSortнад послідовністю рядків, спочатку відсортованих у зворотному порядку.

Можете переконатися, що "сортування за алфавітом" для української та англійської локалі аж ніяк не тривіальне:

TStringList
(У системному шрифті MS Sans Serif різних локалей відображаються не всі символи)

Видно, що сортування літер, яке використовується в українській локалі, цілком хороше і для української мови. В англійській локалі незрозуміла зміна правила сортування: для "a-c" спочатку йде велика буква, а потім мала, але для "d-z" порядок обернений (для української мови все одноманітно).

Сортування неалфавітних символів не позбавлене логіки, але йочевидна. Принаймні програмістові ці таблички не завадить мати на увазі.

Код функції сортування, що використовується методомCustomSortу проекті, що додається, найпростіший і реалізує сортування за кодами символів. Навісивши на ці коди свою таблицю перекодування, можна організувати як завгодно химерне сортування.