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

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

Опишем новый метод следующим образом:

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 – на последний из них.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.