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 в прилагаемом проекте, простейший и реализует сортировку по кодам символов. Навесив на эти коды свою таблицу перекодировки, можно организовать сколь угодно вычурную сортировку.

Комментарии   

 
GLew
0 #1 Ошибка в CustomSortGLew 21.04.2017 09:21
begin
i := 1;
l1 := length(s1);
l2 := length(s2);
if l1 = 0 then
if l2 = 0 then begin
result := 0;
Exit;
end
else begin
result := -1;
Exit;
end;
if l2 = 0 then begin
result := 1;
Exit;
end;

repeat
Цитировать
 
 
Tom d`Cat
0 #2 RE: Сортировка в TStringListTom d`Cat 21.04.2017 10:49
Написано же - "код простейший"...
Зачем мне в демонстрационно м примере проверять на пустые строки, если я их сам генерирую?
Принцип представлен, а далее - своими ручками.
В программе RitmInMe есть рабочий код, но ту "смесь бульдога с носорогом" вряд ли имеет смысл демонстрировать в качестве учебного примера.
А для проверки перед repeat достаточно написать if (l1>0) and (l2>0) then
Цитировать
 
 
GLew
0 #3 RE: Сортировка в TStringListGLew 22.04.2017 05:05
Цитирую Tom d`Cat:
Написано же - "код простейший"...
Зачем мне в демонстрационном примере проверять на пустые строки, если я их сам генерирую?
Принцип представлен, а далее - своими ручками.
В программе RitmInMe есть рабочий код, но ту "смесь бульдога с носорогом" вряд ли имеет смысл демонстрировать в качестве учебного примера.
А для проверки перед repeat достаточно написать if (l1>0) and (l2>0) then

Код простейший, но содержит грабли. Недостаточно одного if. Тут вы добавили еще граблей.
Цитировать
 
 
GLew
0 #4 RE: Сортировка в TStringListGLew 22.04.2017 05:26
И, конечно, спасибо за статью. Но, я думаю, даже простейший код надо вычищать для последующего использования.
Цитировать
 
 
Tom d`Cat
0 #5 RE: Сортировка в TStringListTom d`Cat 22.04.2017 09:07
Цитирую GLew:
Недостаточно одного if. Тут вы добавили еще граблей.

Дык if же не один, а с result := l1-l2 работает...
Цитировать
 
 
Tom d`Cat
0 #6 RE: Сортировка в TStringListTom d`Cat 22.04.2017 09:40
Цитирую GLew:
И, конечно, спасибо за статью. Но, я думаю, даже простейший код надо вычищать для последующего использования.

Разбираясь с различными проблемами в Delphi, я нахомячил каталог в 8 гигабайт. Конечно, не всё это архивы, есть и дубли, и куча мусора... Но, собираясь писать эту статейку, я стоял перед выбором: выкладывать свой рабочий код или нечто, достаточное для демонстрации принципа, Вот копание в тех 8-и гигах интернетовской "руды" и подтолкнули меня писать проще.
Цитировать
 
 
Tom d`Cat
0 #7 RE: Сортировка в TStringListTom d`Cat 22.04.2017 11:25
Цитирую GLew:
Код простейший, но содержит грабли.

Любой код работает в конкретных условиях. Этот предназначен для ситуации, когда пустых строк не может быть в принципе - строки генерируются программно по определённому правилу.

Вообще-то, требование универсальности кода, как и использования строк в Делфи - тема холиварная. Универсальный код и строки хороши - но на небольших или "медленных" задачах. Когда количество строк доходит до миллиона, и код приходится оптимизировать под быстродействие, и со строками работать аккуратнее, учитывая неявные, но очень ресурсоёмкие операции с памятью.
Вот и здесь универсальность - проверка на пустые строки - отсутствует. Зато введены "лишние" операторы - перенос длины строк в локальные переменные. Проигрываем в универсальности и длине кода, выигрываем в быстродействии. ..
Цитировать
 

Добавить комментарий


Защитный код
Обновить