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




Итераторы LastThat и FirstThat.


В дополнении к возможности применять процедуру к каждому элементу коллекции часто необходимо найти определенный элемент коллекции на основании заданного критерия. Это делают итераторы FirstThat и LastThat. Они просматривают коллекцию в противоположных направлениях до тех пор, пока не найдут элемент, соответствующий критерию булевской функции, переданной как аргумент. FirstThat и LastThat возвращают указатель на первый (или последний) элемент, который соответствует условиям поиска. Рассмотрим предыдущий пример списка клиентов и вообразим, что Вы не можете вспомнить номер клиента или как точно пишется его имя. Однако Вы помните, что это был первый клиент из штата Montana. Поэтому Вы будете искать первое вхождение клиента с кодом штата 406. Процедура, выполняющая этот поиск:

procedure SearchPhone(C: PClientCollection; PhoneToFind: String);

function PhoneMatch(Client: PClient): Boolean; far; begin PhoneMatch := Pos(PhoneToFind, Client^.Phone^) <> 0; end;

var FoundClient: PClient; begin FoundClient := C^.FirstThat(@PhoneMatch); if FoundClient = nil then Writeln('No client met the search requirement') else with FoundClient^ do Writeln('Found client: ', Account^, ' ', Name^, ' ', Phone^); end;

Опять заметим, что PhoneMatch вложенная и использует дальнюю модель вызова. Эта функция возвращает True только если номер телефона клиента и шаблон поиска совпадают. Если в коллекции нет объекта, соответствующего критерию поиска, возвращается указатель nil. Запомните: ForEach вызывает процедуру, определенную пользователем, а FirstThat и LastThat вызывают булевскую функцию, определенную пользователем. Во всех случаях им передается указатель на объект в коллекции.




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