Турбо Паскаль 6.0

       

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


TSortedCollection реализует коллекцию, отсортированную по ключу. Сортировка определена через виртуальный абстрактный метод Compare. Следовательно Ваш порожденный тип может задавать требуемую упорядоченность для коллекции объектов любого типа. Метод Insert добавляет элементы, поддерживая это упорядочение и ключи могут быть быстро найдены методом двоичного поиска Search.


Иногда Вам необходимо иметь Ваши данные в определенном порядке. Turbo Vision обеспечивает специальный тип коллекции, который позволяет Вам упорядочить Ваши данные любым способом: TSortedCollection. TSortedCollection порожден от TCollection и автоматически сортирует получаемые объекты. Он так же автоматически проверяет коллекцию, когда добавляется новый элемент и отвергает дублированные элементы. TSortedCollection - это абстрактный тип. Чтобы использовать его, Вы должны вначале решить, какой тип данных Вы будете помещать в коллекцию и определить 2 метода, соответствующие способу сортировки. Чтобы сделать это, Вам нужно породить новый тип коллекции от TSortedCollection. В нашем случае назовем его TClientCollection. Ваш TClientCollection уже знает как делать всю работу над коллекцией. Он может вставить новые записи клиентов и удалить существующие, поскольку наследует все основы поведения от TCollection. Вам необходимо только научить TClientCollection, какое поле использовать как ключ сортировки и как сравнивать двух клиентов и определять, какой из них находится перед другим в коллекции. Вы делаете это, перекрывая методы KeyOf и Compare и реализуя их как показано здесь:

PClientCollection = ^TClientCollection; TClientCollection = object(TSortedCollection) function KeyOf(Item: Pointer): Pointer; virtual; function Compare(Key1, Key2: Pointer): Integer; virtual; end;

function TClientCollection.KeyOf(Item: Pointer): Pointer; begin KeyOf := PClient(Item)^.Name; end;

function TClientCollection.Compare(Key1, Key2: Pointer): Integer; begin {необходимо использовать приведение типа для ключей, поскольку они - нетипированные указатели } if PString(Key1)^ = PString(Key2)^ then Compare := 0 else if PString(Key1)^ < PString(Key2)^ then Compare := -1 else Compare := 1; end;

KeyOf определяет, какое поля или поля должны использоваться как ключ сортировки. В нашем случае - это поле Name клиента. Compare берет 2 ключа сортировки и определяет какой из них должен стоять первым. Compare возвращает -1, 0 или 1 взависимости от того, является ли Key1 меньше, равным или больше Key2. Этот пример использует алфавитную сортировку строк ключей. Заметим, что поскольку ключи, возвращаемые KeyOf и передаваемые Compare - нетипированные указатели, Вам необходимо выполнить приведение типа в PString до ссылки на них. Это все, что Вы должны определить! Сейчас, если Вы переопределите ClientList как PClientCollection вместо PCollection (изменив объявление var и вызов New), Вы распечатаете Ваших клиентов в алфавитном порядке.

{ TVGUID18.PAS } var ClientList: PClientCollection; . begin ClientList := New(PClientCollection, Init(50, 10)); . end;

Заметьте как просто сделать распечатку списка клиентов, отсортированного по номерам, а не по имени. Вам необходимо просто изменить метод KeyOf на возврат поля ACount вместо поля Name.



Содержание раздела







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий