9682

Класс TList - списки

Лекция

Информатика, кибернетика и программирование

Класс TList - списки Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями...

Русский

2013-03-15

57 KB

3 чел.

Класс TList – списки

Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями. Во-первых, их размер может динамически меняться в ходе работы программы, фактически ограничиваясь лишь доступной памятью. Во-вторых, в списках могут храниться элементы разных типов.

Технически списки представляют собой массивы нетипизированных указателей на размещенные в динамической памяти элементы. Эти массивы размещаются в куче - отсюда возможность динамического изменения размеров списков; с другой стороны, входящие в списки нетипизированные указатели позволяют ссылаться на произвольные элементы.

Свойства класса:

property Capacity: Integer;

Содержит количество элементов массива указателей коллекции; всегда больше Count. Если при добавлении очередного элемента Count стало равно Capacity, происходит автоматическое расширение списка на 16 элементов.

property Count: Integer;

Количество элементов списка. Это свойство изменяется при добавлении или удалении элемента.

property Items (Index: Integer): Pointer;

Возвращает указатель на элемент списка по его индексу. Самый первый элемент списка имеет индекс 0.

property List: pPointerList;

Возвращает указатель на массив элементов списка.

Тип pPointerList определен следующим образом:

type

pPointerList = ^TPointerList;

TPointerList = array [0..MaxListSize] of Pointer;

Константа MaxListSize для Delphi 1.0 ограничена значением 16379 элементов. Для старших версий Delphi она ограничивается доступной памятью.

Следует учесть, что свойство Count определяет количество помещенных в список элементов, в то время как Capacity - текущую емкость списка. Если при добавлении очередного элемента обнаруживается, что емкость списка исчерпана, происходит наращивание емкости на фиксированную величину (для Count меньше 5 - на 4 элемента, для Count в диапазоне 5...7 - на 8, для Count больше 7 - на 16). При этом сначала резервируется память для размещения расширенного массива указателей, затем в нее копируется содержимое старого массива, после чего старый массив указателей уничтожается (занимаемая им память возвращается Windows). Если вы заранее знаете, сколько элементов необходимо поместить в список, установите в начале работы нужное значение в свойство Capacity - это снизит непроизводительные затраты времени на расширение списка.

Методы класса:

function Add (Item: Pointer) : Integer;

Добавляет элемент Item в конец списка и возвращает его индекс.

procedure Clear;

Очищает список, удаляя из него все элементы. Не освобождает память, связанную с каждым удаленным элементом. Устанавливает в свойства Count и Capacity значение 0.

procedure Delete (Index: Integer) ;

Удаляет из списка элемент с индексом Index. Все элементы, расположенные за удаляемым, смещаются на одну позицию вверх.

procedure Exchange (Index1, Index2 : Integer);

Меняет местами элементы с индексами Index1 и Index2.

function Expand: TList;

Расширяет массив элементов, увеличивая Capacity.

function First: Pointer;

Возвращает указатель на самый первый элемент списка.

function IndexOf (Item: Pointer) : Integer;

Отыскивает в списке элемент Item и возвращает его индекс.

procedure Insert (Index: Integer; Item: Pointer) ;

Вставляет элемент Item в позицию Index списка: новый элемент получает индекс Index, все элементы с индексами Index и больше увеличивают свой индекс на 1. При необходимости расширяет список.

function Last: Pointer;

Возвращает указатель на последний элемент списка.

procedure Move (CurIndex, NewIndex: Integer) ;

Перемещает элемент в списке с позиции CurIndex в позицию NewIndex. Все элементы старого списка с индексами от CurIndex-1 до NewIndex уменьшают свой индекс на 1.

procedure Pack;

Упаковывает список: удаляет пустые элементы в конце массива индексов.

function Remove (Item: Pointer) : Integer;

Отыскивает в списке элемент Item и удаляет его.

procedure Sort (Compare: TListSortCompare) ;

Сортирует коллекцию с помощью функции Compare.

Методы Add и Insert получают указатель на вставляемый элемент. Чтобы воспользоваться ими, программист должен сам разместить в куче данные и получить соответствующий указатель. Точно так же методы Delete, Remove и Clear не уничтожают распределенные в памяти данные, которые программист должен, если это необходимо, уничтожить сам. Например:

var

 List: TList;

 Item: Pointer;

 Value: AnyType;

begin

 List := TList.Create; // Создаем список

 Item := New(Value);  // Размещаем в куче данные

 List.Add(Item);  // Добавляем элемент к списку

 List.Remove(Item);  // Удаляем элемент из списка

 . . . . . . . .

 Dispose(Item);   // Удаляем его из кучи

 List.Free;    // Удаляем ненужный список

end;

Метод Sort сортирует список по критерию, устанавливаемому функцией Compare. Тип TListSortCompare определен следующим образом:

TListSortCompare = function(Item1,Item2:Pointer):Integer;

Таким образом, функция Compare получает указатели на два элемента списка. Результат сравнения:

  •  любое отрицательное число, если Item1^ < Item2^;
  •  0, если Item1^ = Item2^;
  •  любое положительное число, если Item1^ > Item2^.

Критерий сравнения данных устанавливается программистом и реализуется в функции Compare.

В следующем примере в список List помещается 20 случайных вещественных чисел, равномерно распределенных в диапазоне 0...1. Список сортируется по возрастанию чисел и отображается в компоненте mmOutput (многострочный редактор из лабораторной работы № 4).

type

 PDouble = ^Double; {Этот тип используется для приведения нетипизи-
       рованных указателей к указателям на вещественный тип Double}

 function Comp(Item1, Item2: Pointer): Integer;

 // С помощью этой функции реализуется сортировка чисел

 begin

   if PDouble(Item1)^ < PDouble(Item2)^ then

     Result := -1

   else if PDouble(Item1)^ > PDouble(Item2)^ then

     Result := 1

   else

     Result := 0

 end;

 procedure TfmExample.bbRunClick(Sender: TObject);

 // Обработчик нажатий кнопки bbOk выполняет основную работу

 var

   k: Integer;

   List: TList;

   pD: PDouble;

 begin

   List := TList.Create; // Создаем список

   for k := 1 to 20 do  // Наполняем его

   begin

     New(pD);    // Резервируем память

     рD^ := Random;  // Помещаем в нее случайное число

     List.Add(pD);   // Добавляем к списку

   end;

   List.Sort(Comp);  // Сортируем список по возрастанию

   mmOutput.Lines.Clear; // Очищаем редактор mmOutput

   {В следующем цикле наполняем mmOutput и уничтожаем элементы List}

   for k := 0 to List.Count-1 do

   begin

     pD := List[k]; // Очередное число из списка

     mmOutput.Lines.Add(FloatToStr(pD^)); // Помещаем в mmOutput

     Dispose(pD)      // Уничтожаем число

   end;

   List.Free;       // Уничтожаем список

 end;


 

А также другие работы, которые могут Вас заинтересовать

27907. Диагностирование рулевого управления. Параметры. Оборудование 38.5 KB
  При диагностике РУ определяют люфт рул колеса и усилие необходимое для его поворота при вывешенных колёсах потерь на трение проверяют также крепления и состояние шарнирных сочленений тяг рулевого привода. На а м с гидравлическим усилителем рулевого управления люфт измеряют при работающем двигателе. Кроме люфта рулевого колеса необходимо проверить зазоры в шарнирных соединениях рулевых тяг по относительному перемещению шаровых пальцев и наконечников или головок тяг при резком повёртывании рулевого колеса в обе стороны зазор в...
27908. Причины, затрудняющие пуск холодных двигателей. Средства, облегчающие пуск холодных двигателей (без подогрева, разогрева) 188.5 KB
  Припуском на обработку называется слой металла подлежащий удалению с поверхности заготовки в процессе обработки для получения готовой детали. Размер припуска определяют разностью между размером заготовки и размером детали по рабочему чертежу; припуск задается на сторону. Обозначая общий припуск на обработку z0 размер заготовки аз и размер готовой детали ад получаем: для наружных поверхностей z0 = аз ад; для внутренних поверхностей z0 = ад аз. Тогда общий припуск на обработку равен сумме межоперационных припусков по всем...
27909. Процессы, происходящие в природе и технике 102.5 KB
  Процессы, происходящие в природе и технике, могут быть подразделены на две большие группы: процессы, описываемые функциональными зависимостями, и случайные или вероятностные (стохастические) процессы
27910. Исследование работы неуправляемых однофазных выпрямителей с помощью по «Electronics Workbench» 311.5 KB
  Выпрямители служат для преобразования переменного напряжения питающей сети в постоянное. Основными компонентами выпрямителей служат вентили – элементы с явно выраженной нелинейной вольт-амперной характеристикой. В качестве таких элементов используют кремниевые диоды.
27911. Ремонт подшипников кол вала. Обоснование необходимости ремонта 48 KB
  3 Системы сертификации действующие в сфере автомобильного транспорта. Правовые основы сертификации в РФ. Началом для введения сертификации послужило принятие двух законов: О защите прав потребителя О сертификации товаров и услуг В 1998 году были приняты кардинальные изменения к закону О сертификации товаров и услуг которые в качестве формы подтверждения соответствия определили: Обязательную сертификацию. С этого момента 1998 начали развиваться системы добровольной сертификации.
27912. Оценка технического состояния а/м. Нормативные значения параметров тех состояния. Начальное, предельно-допустимое и предельное значение параметров тех сост 90 KB
  2 Способы мойки и очистки деталей. Очистка деталей от нагара накипи и продуктов коррозии производится механическим термохимическим и комбинированным методами. Механическая очистка твердых отложений на а м дет осуществляется при помощи металлических щеток косточковой крошкой металлическим песком гидропескоструйной обработкой. Косточковая крошка изготавливается из скорлупы зёрен плодов является мягким материалом и не разрушает повти дет включая алюминиевые.
27913. Комплексные показатели эффективности системы ТО и ремонта. Расчёт коэффициента технической готовности по нормативным показателям 46.5 KB
  Обозначение допусков размеров и формы на чертежах смотри вопрос 3 При разработке конструкторской документации на изделие в зависимости от вида изделия могут выполняться следующие документы: рабочий чертеж детали – это документ содержащий изображение детали и другие данные необходимые для ее изготовления и контроля; сборочный чертеж – это документ содержащий изображение сборочной единицы и другие данные необходимые для ее сборки и контроля; чертеж общего вида – это документ определяющий конструкцию изделия взаимодействие его составных...
27914. ОПРЕДЕЛЕНИЕ КОМПРЕССИИ 38.5 KB
  Техническая норма времени характеризует время необходимое для выполнения определенной работы в условиях данного производства с учетом передового опыта и современных достижений техники технологии и организации производства. Тшт = То Тв Тоб Тп То – основное технологического время необходимого на изменение состояния дет формы размеров Тв – вспомогательное время включает время на установку и снятие обрабатываемой дет на промеры подвод и отвод инструмента и тд; Тоб – время на организационнотехническое обслуживание рабочего...
27915. Способы предпусковой тепловой подготовки двигателей. Теплоносители. Устройство передачи тепла к двигателям 56 KB
  Устройство передачи тепла к двигателям. Существующие способы можно разделить на три группы: 1сохранение тепла от предыдущей работы дв; 2использование тепла от внешнего источника; 3холодный пуск. Пуск с использованием тепла от внешних источников применяется при длительном хранении а м – в межсменное время. Для равномерного распределения тепла при вводе пара в рубашку охлаждения в последней применяются специальные отражатели.