Отсортированные коллекции
Часто бывает необходимо каким-либо образом упорядочить коллекцию, т.е. расставить ее элементы в определенном порядке. Для этих целей в 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;