Delphi. Сортировка TStringList с приведением в соответствие другого TStringList

Что делаем?

Есть у нас некоторый TStringList, скажем SLToSort:TStringlist. Нужно его отсортировать – задача элементарная, пишем компараторы для наших данных, включаем CustomSort и всё готово. А что делать, если кроме SLToSort есть просто SomeSL:TStringlist и после сортировки SLToSort – нужно привести его элементы в соответствие с SLToSort, ну то есть так….

Где это может понадобиться?

Случай редкий, но всё же. Я делаю небольшой FTP клиент, который собирает данные о файлах на сервере. В принципе – вся информация уже есть и её хранит ОС, я к тому, что в данном случае вопрос использования БД – это действительно вопрос. Я подумал, что логично, просто собирать эти данные и использовать в FTP клиенте, но возникли нюансы, в частности с сортировкой списков. В SQL одна простая инструкция SortBy, а здесь приходится изобретать, но плюс в том, что программа становится независимой от БД.

Мне казалось, что я вроде сделал это, пока не наткнулся на глюк того, что если элементы одинаковые, то алгоритм работает некорректно. Немного последив за тем, как работает встроенный алгоритм CustomSort, на котором я строил свой алгоритм, я понял, что он меняет местами элементы, даже если они одинаковые. В основе CustomSort лежит QuickSort, если немного раскопать внутренности метода. Но суть не в этом. 

Тестовое приложение у меня выглядело примерно так…

TListView, TMemo*2, и кнопка Sort – вот что нам понадобится – остальное лишнее на окне, лень было убирать))

50

 

51

Итак, создадим пару рандомных листов TstringList в FromCreate и заполним их…

В onDestroy – уничтожим их

TListView и настроим таким образом в FormCreate

Поскольку у нас виртуальный режим для TListView, то данные будем выдавать в событии OnData

Далее, собственно сам алгоритм сортировки и переставления в таком же порядке элементов в другом списке. Чтобы избежать проблем с той ситуацией, когда данные одинаковые, я использую обращение к адресам памяти – они-то в одном TStringlist всегда уникальные для его элементов.

Сортировка, которую мы будем делать далее – опирается на компараторы – функции сравнения для разных данных и направлений сортировки

Собственно сам алгоритм сортировки и переставления в другом списке в соответствии с тем, который отсортировали

Что повесим на кнопку bSort, на OnClick?

В результате всё красиво отсортируется в Ascending порядке. Теперь, если заменить входящие данные, скажем на все одинаковые…

52

53

 

 

то алгоритм не только отсортирует данные, но и сохранит соответствие между двумя TStringList.

Этот пример можно обобщить , для нескольких TStringList. Скажем, есть 1 список, который нужно отсортировать, а остальные просто привести в соответствие. Это можно сделать при помощи TObjectList. Проделаю это в след. посте.

by Stanislav_Panteleev

2 thoughts on “Delphi. Сортировка TStringList с приведением в соответствие другого TStringList

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