Иллюстрированный самоучитель по Turbo Pascal

Отсортированные коллекции

Часто бывает необходимо каким-либо образом упорядочить коллекцию, т.е. расставить ее элементы в определенном порядке. Для этих целей в Turbo Vision предусмотрен специальный объект TSortedCollection. Этот объект порожден от TCollection и, следовательно, уже умеет создавать коллекцию, вставлять в нее элементы и удалять их. Единственное, чего он не умеет – это сортировать коллекцию. В TSortedCollection есть абстрактный метод Compare, который используется для упорядочения элементов и который Вы должны перекрыть, чтобы обеспечить нужную Вам сортировку. Таким образом, чтобы создать отсортированную коллекцию, Вы должны создать объект-потомок от TSortedCollection и перекрыть его метод Compare.

По умолчанию этот метод получает в качестве параметров указатели на два элемента коллекции и должен вернуть 1, 0 или -1 в зависимости от того, больше, равно или меньше какое-то поле первого элемента по сравнению с этим же полем второго элемента. Поле, по которому сравниваются элементы, называется ключевым.

Например, нам требуется создать отсортированную коллекцию, содержащую каталог библиотеки (см. пример п. 19.3), причем в качестве ключевого используется поле Autor^. Тогда создадим новый объект, чтобы перекрыть метод Compare:

type
PSort = Tsort;
TSort = object (TSortedCollection)
Function Compare(Key1, Key2: Pointer): Integer; Virtual;
end;

Если теперь объявить новый метод TSort.Compare следующим образом:

Function TSort.Compare(Key1, Key2: Pointer): Integer;
var
A: PSort absolute Key1;
B: PSort absolute Key2;
begin
if A.Autor < BA.Autor then
Compare: = -1 else if A.Autor = B.Autor then
Compare: = 0
else
Compare: = 1
end; {TSort.Compare}

То после объявления:

var
BookList: PSort;

Вместо:

var
BookList: PCollection;

Программа выведет каталог, отсортированный по фамилиям авторов:

Джордейн Р.
Справочник программиста персональных компьютеров типа IBM PC, XT и AT
Финансы и статистика, 1991, 544 Йенсен К., Вирт Н.
Паскаль. Руководство для пользователя и описание языка финансы и статистика, 1982, 151 Скэнлон Л.
Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера
Радио и связь, 1991, 336 Шелдон
Язык Си для профессионалов И.В.К.-СОФТ, 1991, 383

Ключевое поле определяется методом TSortedCollection.KeyOf. Этот метод по заданному в качестве параметра обращения указателю на элемент коллекции возвращает указатель на ключевое поле. По умолчанию метод KeyOf возвращает указатель на весь элемент, однако Вы можете перекрыть его новым методом, возвращающим указатель на нужное ключевое поле. Пусть, например, нам требуется отсортировать каталог по году издания книг (поле Year). Добавим в описание объекта TSort перекрытие метода KeyOf:

type
TSort = object (TSortedCollection)
…..
Function KeyOf(Item: Pointer): Pointer; Virtual;
end;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.