Коллекции строк
begin {PrintList} WriteLn; WriteLn; List^.ForEach(@PrintWord); WriteLn end; {PrintList} var WordList: PStringCollection; w: String; begin {Основная программа} if not OpenFile(w) then WriteLn('Нельзя открыть файл '+w) else begin WordList: = New(PStringCollection, Init(200.10)); repeat w: = GetWord; if (w < > ' ') and (MaxAvail > 255) then WordList.Insert(NewStr(w)) until w=''; PrintList(WordList) end end.
Отметим, что в операторе:
if (w < > '') and (MaxAvail > 255) then
Осуществляется контроль за доступной динамической памятью. В Turbo Vision есть и встроенные способы контроля кучи – см. п. 19.6.
Как и в любой другой отсортированной коллекции, в коллекции строк по умолчанию хранятся элементы с уникальными ключевыми полями. Чтобы подавить контроль за уникальностью строк, добавьте оператор:
WordList.Duplicates: = True;
Сразу за оператором создания коллекции:
WordList: = New(PStringCollection, Init(200.10));
И сделайте еще один прогон программы, – Вы увидите, как много раз встречается в файле одно и то же слово.
Метод TStringCollection.Compare следует перекрыть, если Вы хотите осуществить свой способ сортировки строк. Например, используя объект:
type PStrSor =TStrSor; TStrSor = object (TStringCollection) Function Compare(k1, k2: Pointer): Integer; Virtual; end; Function TStrSor.Compare(k1, k2: Pointer): Integer; var s1: PString absolute k1; s2: PString.absolute k2; begin if s1< s2 then Compare: = 1 else if s1 = s2 then Compare: = 0 else Compare: = -1 end;
Вместо PStringCollection, Вы сможете вывести на экран список слов, отсортированных в обратном порядке.