RitmInMe Описание программы Интернет реклама сайтов - Dilibrium / Дилибриум Facebook Twitter Google+ LiveJournal Мой Мир ВКонтакте Одноклассники

Font Size

Сортировка в TStringList

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

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

Можете убедиться, что "сортировка по алфавиту" для русской и английской локали отнюдь не тривиальна:
 


(В системном шрифте MS Sans Serif разных локалей отображаются не все символы)

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

Сортировка неалфавитных символов не лишена логики, но и не очевидна. Во всяком случае, программисту эти таблички не помешает иметь в виду.

Код функции сортировки, используемой методом CustomSort в прилагаемом проекте, простейший и реализует сортировку по кодам символов. Навесив на эти коды свою таблицу перекодировки, можно организовать сколь угодно вычурную сортировку.