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



         

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


Иногда Вам необходимо иметь Ваши данные в определенном порядке. 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.




Содержание  Назад  Вперед