Отсортированные коллекции
Опишем новый метод следующим образом:
Functon TSort.KeyOf(Item: Pointer): Pointer; begin KeyOf: = PBook(Item).Yеаr end;
И изменим описание метода Compare:
Function TSort.Compare(Key1, Key2: Pointer): Integer; var A: Integer absolute Key1; B: Integer absolute Key2; begin if А < B then Compare: = -1 else if А = B then Compare: = 0 else Compare: = 1 end; {TSort.Compare}
Теперь после запуска программы на экран будет выведено:
Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка Финансы и статистика, 1982, 151 Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT Финансы и статистика, 1991, 544
Обратите внимание: в отсортированной коллекции теперь хранятся только 2 элемента! Произошло это потому, что по умолчанию TSortedCollection игнорирует новую запись, если в коллекции уже существует элемент, ключевое поле которого имеет такое же значение. Таким образом, обычно в отсортированной коллекции содержатся записи с уникальными ключевыми полями.
Можно ли поместить в коллекцию два или больше элементов с одинаковыми полями? Turbo Vision позволяет сделать это: поле TSortedCollection.Duplicates по умолчанию содержит FALSE, что указывает на уникальность ключевого поля; если перед наполнением коллекции Вы поместите в это поле значение TRUE, коллекция не будет контролировать уникальность ключевых полей.
Изменим начало раздела исполняемых операторов главной программы следующим образом:
begin Bookiist: = New(PSort, Init(50.10)); with BookList do begin Duplicates: = True; {Отменяем уникальность ключей} …… end; ….. end.
Теперь на экран будет выведено:
Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка Финансы и статистика, 1982, 151 Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера Радио и связь, 1991, 336 Шелдон Язык Си для профессионалов И.В.К.-СОФТ, 1991, 383 Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT Финансы и статистика, 1991, 544
Заметим, что, очередной элемент вставляется перед первым элементом с равным значением ключевого поля. Точно также поиск First.That вернет указатель на первый из нескольких элементов с одинаковыми ключевыми полями, а метод LastThat – на последний из них.